在运行时编写和实现新的Java类文件
是否有可能以某种方式将一个新的Java类“导入”到一个正在运行的程序中并加以利用 我可以让一个程序创建一个“.java”类型的新文件,然后将其包含在项目文件中并引用它,而不必重新启动程序吗 下面是我的意思的一个例子:在运行时编写和实现新的Java类文件,java,class,file,runtime,Java,Class,File,Runtime,是否有可能以某种方式将一个新的Java类“导入”到一个正在运行的程序中并加以利用 我可以让一个程序创建一个“.java”类型的新文件,然后将其包含在项目文件中并引用它,而不必重新启动程序吗 下面是我的意思的一个例子: import java.io.*; public class Program { File JClass = new File("JClass.java"); public static BufferedWriter out = null; public static
import java.io.*;
public class Program {
File JClass = new File("JClass.java");
public static BufferedWriter out = null;
public static void main(String[] args) {
try {
out = new BufferedWriter(new FileWriter("JClass.java"));
out.write("public abstract class JClass {");
out.newLine();
out.newLine();
out.write(" public void printSomething(String a) {");
out.newLine();
out.write(" System.out.println(a);");
out.newLine();
out.write(" }");
out.newLine();
out.write("}");
out.close();
} catch (IOException e)
{
System.exit(-1);
}
//Somehow import JClass.java as a class here
JClass.printSomething("Yay! It worked!");
}
}
生成的“JClass.java”文件:
public abstract class JClass {
public void printSomething(String a) {
System.out.println(a);
}
}
类似地,是否可以创建一个项目源文件的副本,编辑文件中的代码,然后以某种方式强制运行程序进行更改
在这一点上,我不太关心实际应用。我只是在探索与编程相关的不同想法。我也知道这可能会引发各种灾难。编辑运行中的代码,并在运行中包含类(我不认为在构建项目时会像其他类那样检查错误),可能会产生非常不可预测的结果。我只是想玩弄一下这个想法
也就是说,如果任何人有任何有用的警告或需要注意的事情,我将不胜感激。否则,如果人们不回答“这是个坏主意”或“有更简单更好的方法来解决问题”,我将不胜感激。我不是想解决这个问题。我只是在探索这个想法
那么,这是可能的吗?您应该研究使用ClassLoader动态加载类
您还可以使用一些机制来编译类,但这可能对您没有多大用处。您实际上想要一个编译器-请查看java.lang.Compiler: 通过编译新的.class文件,可以通过这种方式加载不同的类 这不允许您更改已加载的类。为此,您还需要一个java.lang.instrument.ClassFileTransformer,并且必须在运行时在命令行上指定它 要回答您的其他一些问题:
- 如果一个文件是从.java编译的,它将进行与其他地方编译的相同的检查
- 如果您使用合适的工具(例如BCEL或ASM)创建字节码,那么它仍然会经过多次检查以证明其内部一致性
- 如果您更改一个正在运行的类,那么您所能更改的内容是有限的
提供了一些机制来修改JVM中已经加载并运行的类。又抛出了一个:类。与BCEL、ASM或Jasmin不同,您不需要了解汇编。ECJ只是一个用Java编写的Java编译器。ASM和CGLIB是类似的库。这种方法被广泛使用,可能是动态创建代码的“最佳”方法。Eww,EATS使用匈牙利符号:-(