0

我想知道是否可以在没有字节码操作的情况下在运行时创建一个新的类文件。(例如 ASM、BCEL 等)。我正在考虑将 txt 文件转换为 .java 文件,然后进行编译。

4

4 回答 4

3

您可以创建一个 .java 文件并在运行时编译它。例如:

String fileToCompile = "test" + java.io.File.separator +"MyClass.java";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int compilationResult = compiler.run(null, null, null, fileToCompile);
    if(compilationResult == 0){
        System.out.println("Compilation is successful");
    }else{
        System.out.println("Compilation Failed");
    }
}

不过,这仅在运行时环境是 JDK 时才有效。您当然可以使用 javac 函数来处理这个问题。

于 2013-01-25T20:54:04.133 回答
1

看看Javassist

与其他类似的字节码编辑器不同,Javassist 提供了两个级别的 API:源代码级别和字节码级别。如果用户使用源级 API,他们可以在不了解 Java 字节码规范的情况下编辑类文件。

于 2013-01-25T20:53:02.827 回答
1

考虑使用动态代理。从文档中:

动态代理类(以下简称为代理类)是一个实现类创建时在运行时指定的接口列表的类,其行为如下所述。代理接口就是这样一个由代理类实现的接口。代理实例是代理类的实例。每个代理实例都有一个关联的调用处理程序对象,该对象实现了接口 InvocationHandler。

于 2013-01-25T20:54:13.523 回答
0

是的,这是可能的,但这实际上取决于您选择的技术。它可能不涉及编写实际的 Java 代码。例如,您可以编写任何一种在 JVM 上运行的脚本语言:Groovy、Scala、Clojure、Jython、jRuby、Javascript,并且这些可以编译为字节码。Groovy 是最接近 Java 语法的东西。这里最大的优势是它们可以被修改和重新运行,而无需重新加载它们的字节码,因为它们是被解释的。但是大多数选项都有字节码编译以提高速度。

于 2013-01-25T21:01:00.060 回答