2017-09-15 9 views
0

JavaCompiler를 사용하여 동적 클래스를 만듭니다. 이 클래스는, 지정된 인터페이스를 구현합니다. JavaCompiler에서 컴파일러가 내 클래스를 컴파일 할 수 있도록 올바른 클래스 경로를 만들 수 있습니다.
SecureClassLoader가 종속 인터페이스를 찾지 못함

return new SecureClassLoader() { 
     @Override 
     protected Class<?> findClass(String name) throws ClassNotFoundException { 
      byte[] b = javaClassObject.getBytes(); 
      return super.defineClass(name, javaClassObject.getBytes(), 0, b.length); 
     } 
    }; 

가 컴파일 된 클래스를로드하지만 loadClass 메소드를 호출 할 때이 오류가 : 않는 NoClassDefFoundError : refac/IBewertungsAlgorithmus (잘못된 이름을

//creating the classpath from parent application to be same as the runtime's 
ClassLoader dummyc=getClass().getClassLoader(); 
URLClassLoader urlClassLoader=(URLClassLoader)dummyc; 
URL[] urls=urlClassLoader.getURLs(); 
String classpath = ""; 
for (URL i : urls) { 
    classpath += ";" + i.getPath().substring(1); 
} 

가 나는 익명의 클래스 로더를 사용 : refac/MyClass)

클래스 로더에 대한 컴파일러 작업에 대해 설정 한 것과 동일한 클래스 경로를 설정할 수 있습니까?

답변

0

해결책을 찾았습니다.
SecureClassLoader뿐만 아니라 모든 부모 클래스의 ClassLoader도 필요합니다.

public ClassLoader getClassLoader(Location location) { 
    ClassLoader cl = DynamicCompiler.class.getClassLoader(); 
    return new SecureClassLoader() { 
    @Override 
    protected Class<?> findClass(String name) throws ClassNotFoundException { 
       byte[] b = javaClassObject.getBytes(); 
       if (name.contains("MyClass")){ 
        return super.defineClass(name, javaClassObject.getBytes(), 0, b.length); 
       } else { 
        return cl.loadClass(name); 
       } 

      } 
     }; 
    } 

컴파일 된 클래스에 FindClass 검색의 첫 번째 호출은, 그래서 SecureClassLoader가의 defineClass는 전화를해야합니다.
다음은 컴파일 된 클래스의 종속성에 대한 호출입니다. 이러한 클래스를로드하려면 상위 클래스 로더의 loadClass 메소드가 필요합니다.