在运行时重新编译对象

时间:2012-05-15 14:22:06

标签: java oop compilation runtime reloading

我正在java中开发一个项目,在运行主文件之后,一些java文件会被更改,如果我在同一次执行期间再次运行该文件,则输出不会显示在java文件中完成的更改

例如,有2个文件。 Main.java和file1.java

main.java

public static void main(string[] argv)
{

    file1 obj = new file1();
    obj.view();
        Scanner in = new Scanner(System.in);
        String x = in.nextLine();
    //before entering any value i manually updated the content of file1.java
    obj = new file1();
    obj.view();
}

file1.java (更新前)

public class file1
{

    public void view()
    {

        system.out.println("This is test code!!");
    }


}

file1.java (更新后)

public class file1
{

    public void view()
    {

        system.out.println("That was done for Testing!!");
    }


}

Output :
This is test code!!

This is test code!!

3 个答案:

答案 0 :(得分:1)

您必须重新编译代码才能查看更改。

你可以做的是用java编译一个字符串(在从文件读取之后)并通过反射调用类的方法。

HERE是有关如何以编程方式编译字符串的分步指南。

答案 1 :(得分:0)

更新Java文件不会影响JVM执行的运行时指令。

编译Java应用程序时,.java源代码文件被编译为包含字节码指令的.class文件,而这些指令又由JVM解释。当JVM需要一个类时,它会通过一个称为类加载器的特殊对象将适当的.class文件加载到内存中。

将此应用于您的示例 - 当您第一次引用类File1时,JVM会将File1类加载到内存中。此类内存表示将持续存在,直到类加载器被销毁或JVM重新启动。对JVM不会对file1.java类进行任何更改 - 首先是因为类加载器不会重新加载定义,其次是因为定义不会更改,直到重新编译file1.java类。

要在运行时更改对象的行为,可以使用反射API,请参阅here

答案 2 :(得分:0)

您无需编译源代码即可完成您示例附近的任何操作。

public class MyView 
{
   String the_string;
   public MyView   (String string) { the_string = string; }
   public void setString (String string) { the_string = string; }
   public void view () { system.out.println (the_string); } 
}

public static void main(string[] argv)
{

    MyView obj = new MyView("This is test code!!");
    obj.view();
        Scanner in = new Scanner(System.in);
        obj.setString (in.nextLine());
    obj.view();
}