当前位置: 首页 > 面试题库 >

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

寇桐
2023-03-14
问题内容

是否可以通过某种方式将新的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
教程中,有一个部分用于从头开始定义新类。查看API,以了解如何添加新方法等。在Javassist
API中查看CtNewMethod.make。

JBoss使用Javassist来实现面向方面的编程。

您还可以签出EATS(感兴趣的仪器方法),它利用Javassist在运行时向现有方法添加新代码。Eats不是发行版,但可以:o

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



 类似资料:
  • 问题内容: 我正在编写一个规则引擎,该引擎执行由条件构造确定的简单分配。规则必须为XML格式,这是项目的先决条件。我已经将XML模式建模为类似于简单的代码块。我希望解析XML,然后将其转换为Java代码。然后,我希望在运行时编译(并运行)此代码。这样做意味着我的规则引擎不再充当解释器,而是执行本机Java字节码。 我已经确定了解析阶段,或多或少的Java代码生成阶段。我现在想弄清楚最后一个阶段-运

  • 错误: 更新vlucas/phpdotenv(v2.4.0= 目前AWS实例RAM:2GB 虽然我们已经解决了这个问题,从2GB升级内存= 请检查以下几点: 1) Laravel更新软件包(composar.phar update)所需的推荐内存是多少? 2)laravel在作曲家更新时也使用SWAP内存吗?

  • 我用Intellij来解决这个问题。但我有最新版本的所有新安装在我的系统。 ...已由最新版本的Java运行时(类文件版本57.0)编译,此版本的Java运行时仅识别52.0以下的类文件版本 我已经设定: 完整的错误消息:

  • 本文向大家介绍在JDK和Eclipse下如何编写和运行Java Applet,包括了在JDK和Eclipse下如何编写和运行Java Applet的使用技巧和注意事项,需要的朋友参考一下 Java Applet的源代码如下: 在Eclipse下,可以在编好程序后直接点击Run-->Run即可运行Java Applet程序。 在JDK环境下,要在自己的Java目录下,建立一个html型文件,这里我建

  • 这大约在3个月前起作用,这是我最后一次编辑这个JSON文件。当时的变化是添加了对的引用,这是我编写的一个库。运行phpupdate给了我以下错误。 问题1 原理/迁移dev-master的安装请求- 条令/迁移开发主机需要symfony/console~2.3- 问题二 条令/迁移1.0。x-dev需要symfony/console~2.3- 条令/条令迁移捆绑包开发主机需要条令/迁移~1.0-

  • 我用Intellij来解决这个问题。但我有最新版本的所有新安装在我的系统。 ...已由最新版本的Java运行时(类文件版本57.0)编译,此版本的Java运行时仅识别52.0以下的类文件版本 我已经设定了路径,试图在项目结构中找到一个变化 完整的错误消息: