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

前端之家收集整理的这篇文章主要介绍了在运行时编写和实现新的Java类文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否有可能以某种方式将新的 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以了解如何添加方法等.查看Javassist API中的CtNewMethod.make.

Javassist是JBoss用来实现面向方面编程的东西.

您还可以查看EATS(仪器方法将是您感兴趣的),它使用Javassist在运行时向现有方法添加代码. Eats不是发布版本,但它有效:o

JPDA提供了一些修改已在JVM中加载和运行的类的机制.

猜你在找的Java相关文章