Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行时编写和实现新的Java类文件_Java_Class_File_Runtime - Fatal编程技术网

在运行时编写和实现新的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

是否有可能以某种方式将一个新的Java类“导入”到一个正在运行的程序中并加以利用

我可以让一个程序创建一个“.java”类型的新文件,然后将其包含在项目文件中并引用它,而不必重新启动程序吗

下面是我的意思的一个例子:

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)创建字节码,那么它仍然会经过多次检查以证明其内部一致性
  • 如果您更改一个正在运行的类,那么您所能更改的内容是有限的

Javassist将允许您在运行时修改现有类并创建新类。

在Javassist中有一个部分用于从头定义新类。查看以了解如何添加新方法等。在JavassistAPI中签出

Javassist是JBoss用来实现面向方面编程的工具

您还可以签出(instrument方法很有意思),它在运行时使用Javassist向现有方法添加新代码。Eats没有发布版本,但它可以工作:o


提供了一些机制来修改JVM中已经加载并运行的类。

又抛出了一个:类。与BCEL、ASM或Jasmin不同,您不需要了解汇编。ECJ只是一个用Java编写的Java编译器。

ASM和CGLIB是类似的库。这种方法被广泛使用,可能是动态创建代码的“最佳”方法。Eww,EATS使用匈牙利符号:-(