Java 我如何在飞行中改变班级行为?

Java 我如何在飞行中改变班级行为?,java,jvm,on-the-fly,Java,Jvm,On The Fly,我试图编辑一个类文件,并使它在运行时可供JVM使用。 有可能吗?我怎么做 例如: main() { for (int i=0;i<10;i++) { NewClass.method(); //ask user if to continue.. } } public class NewClass() { static void method() { sysout("hi"); } } main(){ 对于(i

我试图编辑一个类文件,并使它在运行时可供JVM使用。 有可能吗?我怎么做

例如:

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

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

对于(inti=0;i您必须使用Java反射

  • 您可以在运行时使用动态加载类
  • 在您得到的类的实例上使用方法,您可以调用任何您想要命名的静态方法
  • 如果您的类在设计时是固定的,您只需跳过第一点。一些代码:

    ...
    
    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编译器的用法。

    为了让您的工作更轻松,这里有完整的代码:请尝试{for(int iCount=0;iCount您应该将代码放在您的问题中。更好地解释:您希望能够在运行时动态加载类并执行其方法之一?我建议使用用于从控制台读取的。您的注意力真的集中在类加载上,还是向方法添加参数可以解决您的问题?更具体一点。我想运行一个类的主方法,当它运行时,我想引用另一个类,编辑它并引用第二个类的相同方法以获得不同的输出。基本上我不想1.停止jvm,2.编辑代码,3.再次运行代码。我想1.在运行时编辑代码并反映更改。输入哪个类:Called Compiled successfully.输入哪个方法:calledMethod1 Oldsysoutmethod1输入哪个类:Called已成功编译。输入哪个方法:calledMethod1 Oldsysoutmethod1我想编辑相同的方法并获取Newsysoutmethod1,而不必重新运行主java程序。我还尝试向调用的java文件添加一个新方法,并将该方法名称作为输入,但我没有得到任何方法例外重新命名相同的类文件是可能的卸载旧的类文件并重新加载相同的文件名和编辑过的内容Pawan:卸载类并重新加载更改过的版本不是一个简单的解决方案。也许开发你自己的类加载器,但不是一件容易的事情。一个非常简单的解决方案(如果您可以接受的话),将是在每次编辑时更改类的名称,或者更改其包名。我正在遵循更改类名的想法,因为这只是出于调试目的:)谢谢。。
    ...
    
    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);
    }
    ...