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

2023-11-26

是否有可能以某种方式将新的 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(instrument 方法将会很有趣)它利用 Javassist 在运行时向现有方法添加新代码。 Eats 还没有发布版本,但它可以工作:o

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • JFreeChart - 将图表线的 SeriesStroke 从实线更改为单线虚线

    此处接受的答案 JFreechart Java 如何绘制部分虚线和部分实线的线 帮助我开始改变图表上的系列划线 在单步执行我的代码并观察更改后 我发现我的系列笔画实际上在应该的时候 在某个日期 dashedAfter 之后 更改为 dash
  • 陷入 Azure OAuth2 令牌请求中的两个错误之间

    我正在为 OWIN 和 Azure Active Directory 实现 OAuth2 提供程序 FWIW 目前 OpenId Connect 选项不符合这项工作的要求 我获得一个身份验证代码 并使用 auth code 状态返回到我的回
  • 在反向传播中使用 sigmoid 函数计算误差

    我有一个关于反向传播的简单问题 我正在看以下内容 http www4 rgu ac uk files chapter3 20 20bp pdf 在这篇论文中 它说计算神经元的误差为 Error 输出 i 1 输出 i 目标 i 输出 i 我
  • 达到内存限制时 NSCache 崩溃(仅在 iOS 7 上)

    我们在应用程序中使用 NSCache 作为 UIImages 这在小于 7 的 iOS 版本上工作得很好 当发生内存警告时 NSCache 按预期释放对象 然而 在 iOS 7 上 我们的应用程序在第一次内存警告后不久就崩溃了 因此 似乎使
  • 工具栏外观中的 extjs 按钮

    嘿 我确实有一个小问题 但我似乎无法找到答案 当我在 extjs 工具栏中放置一个按钮时 它会以默认外观出现 就像任何 Windows 工具栏选项一样 我如何使它看起来像表单中的按钮 尝试这样 tbar xtype button text
  • 如何检索这台计算机的IP地址?

    检索机器 IP 地址 第一个打开的接口 的最不麻烦 模块包含 代码长度等 的方法是什么 我知道一些使用 MSINET 的解决方案 但我相信我们可以做得更好 不要回复 Function HomeIP as Atring HomeIP 127
  • 加载没有 Segue 的 StoryBoard 视图

    我真的很喜欢将所有视图都放在故事板中 但有时我会看到一个基于代码生成的按钮显示的视图 因此不会有 Segue 引用 它将完全断开连接故事板 不过 我仍然想在故事板中设计它 这样我就可以对所有屏幕有一个很好的概览 当加载 UIViewCont
  • iOS应用程序更新测试

    有没有一种方法可以测试应用程序何时更新 我很尴尬 因为有一个错误只在应用程序更新时出现 并且没有调查 如果您问是否想通过应用程序商店查找应用程序何时更新 我不知道有这样的方法 执行此操作的一种黑客方法是将当前应用程序版本保存到 NSUser
  • 在队列为空之前调用 join 时,Python 3 多处理队列死锁

    我对理解队列中的队列有疑问multiprocessingpython 3中的模块 这就是他们在编程指南 请记住 已将项目放入队列的进程将在之前等待 终止 直到所有缓冲的项目都被 feeder 线程送入 底层管道 子进程可以调用 Queue
  • 如何增加 Sphinx / 重构文本中的固定宽度字体大小?

    我正在使用 Sphinx 生成使用重构文本作为标记的文档 但是 当我使用一些内联格式使文本以固定宽度字体显示时 no cache渲染的 HTML 以较小的字体显示文本 如何增加 Sphinx reStructured Text 中的固定宽度
  • 手机间隙没有状态栏?

    我一直试图让状态栏消失 因为我想放入全屏游戏 我在 iPhone 上使用 PhoneGap 提前致谢 对于 iPhone 只需添加
  • MATLAB 中的特征值

    在 MATLAB 中 当我运行命令时 V D eig a 对于对称矩阵 最大特征值 及其相关向量 位于最后一列 但是 当我使用非对称矩阵运行它时 最大特征值位于第一列 我正在尝试计算特征向量中心性 这要求我计算与最大特征值相关的特征向量 因
  • 在 GCC 风格的扩展内联汇编中,是否可以输出“虚拟化”布尔值,例如进位标志?

    如果我有以下 C 代码来比较两个 128 位无符号整数 并使用内联 amd 64 asm struct uint128 t uint64 t lo hi inline bool operator lt const uint128 t a c
  • Firefox、Edge 和 IE 中的 Flexbox 列反转

    我正在尝试制作一个响应式应用程序 在较大的屏幕上 有一个 div 列表 您可以滚动up查看以前的 div 传统 行为 在较小的屏幕上 它显示相同的列表 但顺序相反 因此滚动down看到显示div 我认为 flexbox 将是一个很棒的解决方
  • Entity Framework Core 服务默认生命周期

    在 ASP NET Core 应用程序中 我可以像这样通过 DI 注册 DbContext services AddDbContext
  • Android 将值从 Activity 传递到适配器

    我想将变量从活动传递到适配器 我的适配器看起来像这样 public SampleAdapter Activity context ArrayList
  • PhoneGap:修改 config.xml 以将属性添加到 Info.plist ion iOS

    对于我的应用程序 我需要向 iOS 的 Info plist 文件添加一些设置 我认为最好的方法是将这些设置添加到我的 config xml 文件中 我正在使用 PhoneGap 当我将以下内容添加到 config xml 文件并运行时 c
  • Android ExpandableListActivity 和 SimpleCursorTreeAdapter?

    我正在为 Android 编写一个简单的应用程序 我有两张桌子 一张名为 grous 另一张名为 group items 我想使用可扩展列表来显示两个表中的数据 最好的方法是什么 是否可以使用SimpleCursorAdapter来映射数据
  • 如何更改ms图表中X轴标签的方向

    您好 我正在 winforms 应用程序中使用 Ms 图表控件来根据日期显示值 我需要将 x 轴标签值 日期 方向水平更改为垂直 我搜索了很多属性 但没有找到任何解决方案 任何人都可以帮助我解决这个问题 非常感谢 据我了解您的问题 您询问如
  • 在运行时编写和实现新的 Java 类文件

    是否有可能以某种方式将新的 Java 类 导入 到正在运行的程序中并使用它 我可以让程序创建一个 java 类型的新文件 然后将其包含在项目文件中并引用它 而无需重新启动程序吗 以下是我的意思的一个例子 import java io pub