2014-05-11 3 views
1

좋아요, 그래서 사용자가 .java 파일을 작성하고 실행하는 프로그램이 있습니다 (런타임 중에 .... duh !!). 현재 사용자는 하나의 .java 파일 만 편집 할 수 있습니다 (현재). 이제 .java 파일을 컴파일하여 .class 파일로 만들고 싶습니다. 파일을 실행하려면 사용자에게 void main() 함수가 있어야하며이 함수를 실행하기 만하면됩니다. 그래서, 나는 JTextArea에를 사용하여 편집 가능 된 .java 파일을 만들었 등의 BufferedReader, BufferedWriter로, 는 이제 파일을 컴파일하기 위해 작성한 코드는 다음과 같습니다.java 파일을 컴파일하고 그 파일에서 함수를 실행하십시오.

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>(); 
try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null)) { 
    Iterable<? extends JavaFileObject> compilationUnits = filemanager.getJavaFileObjectsFromStrings(Arrays.asList("src/User/Script.java")); 
    JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits); 
    boolean success = task.call(); 
    System.out.println(success); 
} catch(IOException e){ 
    System.out.println("IOException"); 
} 

이 코드가의 .class에 파일을 컴파일 파일. 이제 main 함수를 실행하면 작동하지 않습니다. 사실 성공의 가치는 사실입니다 (사실대로 인쇄 됨). 이 작업이 완료되면, 사용자는 "실행"버튼을 누르면 내가 기능을 실행하려면이 옵션을 사용

Script script = new Script(); script.main();

를 이제 어떤 이유로, 스크립트 자체를 업데이트하지 않습니다. 그것은 여전히 ​​스크립트가 수정되기 전에 작성된 것과 같은 것을 실행합니다 ... 파일은 예상대로 작성되지만 스크립트는 다음 번에 프로그램이 시작될 때만 "업데이트"됩니다. (필자는 독립형으로 이것을 시도하지 않았지만 IDE에서 업데이트합니다 ... Netbeans입니다).

이제이 문제에 대한 해결책이 필요 할뿐만 아니라 수행중인 작업에 대한 설명도 필요합니다. 제발, 나에게 무엇이 잘못되었는지, 왜 틀렸는 지, 그리고 그것을 고치기 위해해야 ​​할 일에 대해 설명해주십시오.

감사합니다,
Rakshith

답변

2

여기서 문제는 이미 JVM에로드 된 클래스입니다. 클래스를 언로드하고 새 버전을 다시로드해야합니다. 응용 프로그램을 시작하기 전에 클래스가 존재하지 않으면 작동해야합니다.

이런 일을하기 위해 고유 한 클래스 로더를 만들어야합니다.이 작업은 어려운 작업이므로 javassist은 제외하고 라이브러리/도구를 알지 못합니다.

좋은 해킹은 원하는 클래스 또는 패키지의 이름을 바꾸는 것이지만, 이것이 받아 들일 수 있는지 확실하지 않습니다.

관련 문제