`
hulunberbus
  • 浏览: 896283 次
文章分类
社区版块
存档分类
最新评论

通过tool.jar动态生成类并编译加载

 
阅读更多

jdk/lib目录下的tool.jar包含了一个完整的java编译器包,利用它可以实现类文件的运行时动态生成并且编译加载。下面是一个例子:

import java.io.*;
import java.util.*;
import java.lang.reflect.*;

public class MakeTodayClass {
  Date today = new Date();
  String todayMillis = Long.toString(today.getTime());
  String todayClass = "z_" + todayMillis;
  String todaySource = todayClass + ".java";
  
  public static void main (String args[]){
    MakeTodayClass mtc = new MakeTodayClass();
    mtc.createIt();
    if (mtc.compileIt()) {
       System.out.println("Running " + mtc.todayClass + ":/n/n");
       mtc.runIt();
       }
    else
       System.out.println(mtc.todaySource + " is bad.");
    }

  public void createIt() {
    try {
      FileWriter aWriter = new FileWriter(todaySource, true);
      aWriter.write("public class "+ todayClass + "{");
      aWriter.write(" public void doit() {");
      aWriter.write(" System.out.println(/""+todayMillis+"/");");
      aWriter.write(" }}/n");
      aWriter.flush();      
      aWriter.close();
      }
    catch(Exception e){
      e.printStackTrace();
      }
    }
  
  public boolean compileIt() {
    String [] source = { new String(todaySource)};
    ByteArrayOutputStream baos= new ByteArrayOutputStream();

    new sun.tools.javac.Main(baos,source[0]).compile(source);
    // if using JDK >= 1.3 then use
    //   public static int com.sun.tools.javac.Main.compile(source);    
    return (baos.toString().indexOf("error")==-1);
    }
    
  public void runIt() {
    try {
      Class params[] = {};
      Object paramsObj[] = {};
      Class thisClass = Class.forName(todayClass);
      Object iClass = thisClass.newInstance();
      Method thisMethod = thisClass.getDeclaredMethod("doit", params);
      thisMethod.invoke(iClass, paramsObj);
      }
    catch (Exception e) {
      e.printStackTrace();
      }
    }
 }
分享到:
评论

相关推荐

    antlr-runtime-3.0.1.jar.zip

    4. **运行解析器**:在应用程序中加载ANTLR-runtime-3.0.1.jar,并执行生成的解析器,对输入进行分析。 ANTLR的特性包括: - **强大的错误恢复机制**:ANTLR具有良好的错误处理能力,当遇到语法错误时,可以尝试...

    antlr-runtime-3.0.jar.zip

    在Java项目中,如果你需要使用ANTLR的运行时库,通常会将`antlr-runtime-3.0.jar` 添加到项目的类路径(classpath)中,或者通过Maven、Gradle等构建工具管理依赖,确保在编译和运行时能够正确地找到和加载ANTLR的...

    java 动态编译.java文件,动态运行类 _1.2

    在Java编程环境中,有时我们需要在程序运行时动态地编译.java源代码文件并执行新生成的类。这种功能在处理代码生成、插件系统或测试自动化等场景中非常有用。本篇文章将深入探讨如何实现Java的动态编译与运行。 1. ...

    com.springsource.tcl.lang.jacl-1.4.1生成报错替换包.zip

    在使用这个替换包之前,确保备份原有的jar文件,并按照项目依赖管理的规则正确引入新包,例如通过Maven或Gradle等构建工具。 对于遇到这类问题的开发者,理解TCL和Jacl的基本概念、熟悉Java的类加载机制以及如何...

    iText以及iText中文所需要的jar包

    "iText所需要的jar包"指的是为了使用iText库,你需要将这些JAR文件添加到项目的类路径中,以便编译和运行时能够找到所需的类和方法。 在处理中文字符时,标准的iText库可能不包含对中文字符集的全面支持。因此,...

    Android反编译工具

    3. 打开`jd-gui.jar`,加载由`dex2jar`生成的.jar文件,查看源代码。 4. 分析源代码,理解APP的功能和实现方式。 需要注意的是,反编译过程可能会丢失一些原始的注释和变量命名,因为这些信息并不存储在字节码中。...

    hibernate核心jar包

    此外,Entity类通过@Entity注解标识,用于映射数据库表,而 Criteria 和 HQL 查询提供了灵活的检索方式。 2. **byte-buddy-1.8.17.jar**:ByteBuddy是一个动态类型生成库,用于在运行时创建新的Java类和接口。在...

    反编译apk tool

    2. 通过"File" -> "Open File"加载.dex或.jar文件。 3. 在界面上查看反编译出的Java源代码。 在实际操作中,这三者通常配合使用:首先使用apktool解压APK,得到.dex文件;然后用dex2jar将.dex转换为.jar;最后通过...

    AndroidAnnotations相关jar包绿色解压版

    在编译期间,Java编译器会触发注解处理器,处理器读取源代码中的注解,然后生成新的Java类,这些类扩展或实现了原始类,并添加了额外的逻辑。这些生成的类在运行时替换原来的类,使得注解的效果得以体现。 4. **...

    ant-apt.jar.zip

    在这个例子中,`apt`任务用于加载APT库,`javac`任务则设置了APT处理器,并指定了生成源代码的目标目录。 总的来说,Ant-APT为Java开发者提供了一个强大且灵活的工具,使得构建过程中可以充分利用APT的能力,提高...

    Android 反编译工具

    4. **使用JD-GUI**:打开JD-GUI,加载由dex2jar生成的.jar文件,查看反编译出的源代码。 5. **分析和修改**:根据需求分析反编译出的代码和资源,如有需要,可以使用Apktool编辑资源文件或修改反编译出的代码。 6....

    集成小工具,可执行jar包

    执行时,Java虚拟机会加载并执行JAR包内的主类,通常是带有`public static void main(String[] args)`方法的那个类。 关于JAR包的制作,一般会用到Java的jar工具,或者通过构建工具如Maven或Gradle来自动化打包过程...

    apktool apk反编译攻击

    4. **动态加载**:关键逻辑部分可以通过动态加载的方式实现,降低被静态分析的风险。 5. **安全检测**:定期进行安全审计,及时发现并修复潜在的安全漏洞。 了解并掌握APK反编译技术,对于开发者来说,既有助于提升...

    常用的jAVA包的作用

    AspectJRT.jar 包含运行时支持AspectJ切面所需的类,而AspectJWeaver.jar则包含了用于编译期和类加载期织入切面的工具。这些包是Spring AOP功能的基础之一。 #### 4. C3P0.jar C3P0 是一个开源的JDBC连接池实现,...

    kettle9.0 第五卷

    《Kettle 9.0深度解析》 Kettle 9.0是Pentaho Data Integration(简称Kettle)的一个...通过深入理解和应用Kettle 9.0,数据工程师和开发人员能够构建高效、灵活的数据集成解决方案,满足企业日益复杂的数据处理需求。

    使用dex2jar反汇编android的apk文件,并用jd-gui查看

    2. **使用jd-gui查看反编译的代码**:打开jd-gui应用程序,然后通过“File”菜单或拖放操作加载刚刚由dex2jar生成的`classes_dex2jar.jar`文件。jd-gui会显示出反编译后的Java源代码,尽管可能与原始源代码有所差异...

    apktool+dex2jar+jd_gui_osx-1.4.0

    3. 打开JD-GUI,加载Dex2jar生成的.jar文件,查看和分析Java源代码。 在实际操作中,可能还需要其他辅助工具,如使用JAD(Java Decompiler)对JD-GUI无法正确反编译的部分进行补充,或者使用Android Asset ...

    hibernatejar包

    最后,`antlr-2.7.6rc1.jar`是ANTLR(ANother Tool for Language Recognition)的库,ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。在Hibernate中,ANTLR用于解析HQL和...

    JADX反编译工具

    运行JADX,加载待反编译的APK或.jar文件,之后就可以在生成的Java源代码中探索应用程序的内部结构了。 总之,JADX作为一款专业的反编译工具,虽然在速度上可能有所欠缺,但凭借其高度准确的源代码还原能力和丰富的...

    ADNROID 反编译工具和证书

    它负责编译、打包和验证资源,生成R类文件,使资源能在运行时被应用程序引用。在反编译过程中,aapt可以用于提取APK中的资源文件。 `apktool.jar`是apktool的主要工作库,包含了所有执行反编译和重新打包操作所需的...

Global site tag (gtag.js) - Google Analytics