2012-05-15 67 views
0

我正在開發一個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!! 
+0

Java在語言級別沒有解釋,它被編譯爲字節碼。修改源代碼意味着它必須重新編譯 – maress

+1

即時修改源代碼是一項高級技術。這聽起來不像是你的意圖,當然也不是你提供的例子所必需的。你想達到什麼目的? – GoZoner

回答

1

您必須重新編譯代碼才能看到更改。

你可以做的是用java編譯一個字符串(在從文件中讀取之後),並通過反射調用類的方法。

HERE是如何以編程方式編譯字符串的分步指南。

0

更新Java文件不會影響JVM執行的運行時指令。

編譯Java應用程序時,.java源代碼文件被編譯爲包含字節碼指令的.class文件,而這些指令又由JVM解釋。當JVM需要一個類時,它通過一個稱爲類加載器的特殊對象將相應的.class文件加載到內存中。

將此應用於您的示例 - 當您首次引用類File1時,JVM會將File1類加載到內存中。這個在類的內存表示中將一直存在,直到類加載器被銷燬或JVM重新啓動。 JVM沒有對file1.java類進行任何更改 - 首先是因爲類加載器不會重新加載定義,其次是因爲在重新編譯file1.java類之前定義不會更改。

要在運行時更改對象的行爲,可以使用反射API,請參閱here

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(); 
}