2012-05-15 5 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

변경 사항을 보려면 코드를 다시 컴파일해야합니다.

자바를 사용하여 문자열을 컴파일하고 (리플렉션을 통해 클래스를 호출하는 방법) 할 수 있습니다.

HERE은 프로그래밍 방식으로 문자열을 컴파일하는 방법에 대한 단계별 가이드입니다.

0

Java 파일을 업데이트해도 JVM에서 실행되는 런타임 지침에 영향을주지 않습니다.

Java 응용 프로그램을 컴파일 할 때 .java 소스 코드 파일은 JVM에서 차례로 해석되는 바이트 코드 명령어가 들어있는 .class 파일로 컴파일됩니다. JVM이 클래스를 필요로 할 때 적절한 클래스 파일을 클래스 로더라는 특수 객체를 통해 메모리에로드합니다.

예제에 적용 - File1 클래스를 처음 참조 할 때 JVM은 File1 클래스를 메모리에로드합니다. 클래스의 메모리 표현은 클래스 로더가 손상되거나 JVM이 재시작 될 때까지 지속됩니다. file1.java 클래스에 대한 변경은 JVM에서 볼 수 없습니다. 클래스 로더가 정의를 다시로드하지 않기 때문이고 두 번째로는 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(); 
} 
관련 문제