gpt4 book ai didi

java - 如何即时更改更改类行为?

转载 作者:行者123 更新时间:2023-11-30 04:46:54 24 4
gpt4 key购买 nike

我正在尝试编辑一个类文件并使其在运行时可供 JVM 使用。这可能吗,我该怎么做?

例如:

main() {
for (int i=0;i<10;i++) {
NewClass.method();
//ask user if to continue..
}
}

public class NewClass() {
static void method() {
sysout("hi");
}
}

当这个循环执行时,我想更改文件NewClass()并将其加载到JVM中,以便它打印“bye”。

完整代码如下:

try {
for (int iCount = 0; iCount < 10; iCount++) {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
System.out.print("Enter which method:");
int i = Integer.parseInt(br.readLine());
System.out.println(i);
if (i == 1) {
Called.calledMethod1();
} else {
Called.calledMethod2();
}
}
} catch (NumberFormatException nfe) {
System.err.println("Invalid Format!");
}

我想运行一个类的主要方法,在它运行时我想引用另一个类,编辑它,并引用第二个类的相同方法并获得不同的输出。

不想想要:

  1. 停止jvm
  2. 编辑代码
  3. 再次运行代码。

我想要

  1. 在运行时编辑代码,并立即反射(reflect)更改。

最佳答案

你必须使用Java反射。使用反射,

  1. 您可以使用 Class 在运行时动态加载类forName method
  2. 使用 invoke方法在你得到的类的实例上,你可以调用任何你想要的静态方法,只要给它的名字。

如果你的类在设计时就固定了,你只需保留第一点。一些代码:

...

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter which class:");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
className=br.readLine()
int results = compiler.run(null, null, null, className+".java");
if(results == 0){

Class clazz = Class.forName(className+".class");
System.out.print("Compiled successfully.Enter which method:");
Object returnValue=clazz.getMethod(br.readLine()).invoke(null);
}
...

但要注意安全问题:上面的代码允许任何人执行运行时可访问的每个类的每个静态方法。如果安全性是您关心的问题之一,那么最好首先验证从控制台收到的输入并测试它们是否与您希望通过控制台提供的类方法之一匹配。

编辑:

阅读您的评论后,我更好地理解了您的问题。如果您的目标是 Java 6,为了在运行时编译类,您可以使用 Java Compiler object 。我已编辑代码以包含 JavaCompiler 的使用。

关于java - 如何即时更改更改类行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10766674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com