java - 在运行时编写和实现新的 Java 类文件

标签 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 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);
    }
}

同样,是否可以创建项目源文件之一的副本,编辑文件中的代码,然后以某种方式将更改强加到正在运行的程序上?

目前我不太关心实际应用。我只是在探索与编程有关的不同想法。我也明白这可能会引发各种灾难。编辑正在运行的代码,并即时包含类(我不认为在构建项目时会像其他类那样检查错误)可能会产生非常不可预测的结果。我只是想尝试一下这个想法。

就是说,如果有人有任何有用的警告或需要注意的事项,我将不胜感激。否则,如果人们不回答“这是个坏主意”或“有更简单更好的方法来解决问题”,我将不胜感激。我不是要解决这个问题。我只是在探索这个想法。

那么,这可能吗?

最佳答案

Javassist 将允许您修改现有类并在运行时创建新类。 http://www.csg.is.titech.ac.jp/~chiba/javassist/

在 Javassist 中 tutorial有一个部分用于从头开始定义一个新类。查看API查看如何添加新方法等。查看CtNewMethod.make在 Javassist API 中。

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

您还可以查看 EATS (仪器方法会很有趣)它利用 Javassist 在运行时向现有方法添加新代码。 Eats 不是发布版本,但它可以工作 :o

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

关于java - 在运行时编写和实现新的 Java 类文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5493784/

相关文章:

java - 一个对象更新另一个对象

泛型类的 Java 8 模糊方法引用

c++ - 理解 C++ 类和函数调用

java - 几个类之间的通信

python-3.x - 如何在Django中创建一个文件夹来存储用户输入

json - 如何解析正在处理的 JSON 文件

java.lang.AssertionError : Status 404

java - 如何将 Actor 放在彼此之上?

java - 在列表中排序时如何跟踪变量? (风险游戏)

file - 马文 : Removing format file extension from created assembly