2009-12-25 4 views
0

나는 기본적인 것을 놓치고 있다는 것을 알고있다. 동적으로 클래스를 컴파일 한 다음 변경 후 다시로드하려고합니다. 다음 코드가 작동합니다. 그러나 두 번 (.java를 변경 한 후) 두 번 호출하면 클래스 정의가 업데이트되지 않습니다. 내가 뭘 놓치고 있니?내 수업이 다시로드되지 않는 이유는 무엇입니까?

File file = new File("/eraseme/Eraseme.java"); 
File[] files = new File[] {file}; 
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();   
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); 
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjects(files); 
CompilationTask task = compiler.getTask(null, fileManager, null, null,null,compilationUnits); 
boolean madeIt = task.call(); // works 

File classFile = new File("/eraseme/Eraseme.class"); 
URL url = classFile.toURL(); 
URL[] urls = new URL[] { url }; 
ClassLoader cl = new URLClassLoader(urls);  
Class cls = cl.loadClass("Eraseme"); 
TestApi test = (TestApi) cls.newInstance(); 
System.out.println(test.getVersion()); 
+0

ClassLoader는 실제로 어떻게 든 사용되지 않습니다. .class에 대해 올바른 파일 이름을 넣지 않더라도 여전히 실행됩니다. –

답변

2

는 당신이 놓치고있는 것은 URLClassLoader에 전달 된 URL이 다음 검색되는 디렉토리해야한다는 것입니다. 무슨 일이 일어나고 있는지, URLClassLoader은 실제로 .class 파일을 찾지 못하고 있지만 클래스를 찾지 못하고 있으며 부모 클래스 로더가 클래스를로드하도록하는 것으로 떨어지고 있습니다.

특히, 코드의 두 번째 비트는 것으로 수정하려고 :

File classFile = new File("/eraseme"); 
URL url = classFile.toURL(); 
URL[] urls = new URL[] { url }; 
ClassLoader cl = new URLClassLoader(urls);  
Class cls = cl.loadClass("Eraseme"); // will try to load /eraseme/Eraseme.class 
TestApi test = (TestApi) cls.newInstance(); 
System.out.println(test.getVersion()); 

참고 클래스가 (패키지 포함) com.mycompany.erasestuff.EraseMe를 호출하면, 그 클래스 로더가 파일에 보이는 것 /eraseme/com/mycompany/erasestuff/EraseMe.class

이렇게하면 시스템 클래스 로더가 EraseMe 클래스를로드 할 수 없게됩니다. 시스템 클래스 로더가 우선하며, URLClassloader은 아무 것도로드하지 않습니다. (불행한 점은 classloader에게 "이 클래스를로드하라"라고 말하면, 첫 번째은 부모 클래스 로더가 클래스를로드 할 수 있는지를 검사 한 다음, 자체 클래스를로드하려고 시도합니다.

+0

감사합니다. Daniel. 여전히 멈췄다 : 클래스 파일을 삭제하더라도 (항상 처음 실행될 때 생성됨) 결과가 변경되지 않습니다. 패키지 이름 (기본 패키지)을 사용하지 않고 File ("/ eraseme")을 사용하도록 변경했습니다. 클래스가 ... 업데이트시 변경되지 않습니다. –

+0

시스템 클래스 경로는 무엇입니까? 시스템 클래스 경로에 "/ eraseme"가 포함되어 있습니까? –

+0

아 ... 좋은 지적이야. 이클립스 프로젝트 자체에 포함시켰다. 프로젝트에서이 경로를 제거 했으므로 코드가 완벽하게 작동합니다. 도움을 요청 해주셔서 감사합니다. –

관련 문제