2014-10-23 2 views
0

바이트 배열에서 Tomcat에 새로운 클래스 (이전에로드되지 않은)를로드하려고합니다. 또한 Tomcat 응용 프로그램 클래스 로더에 대한 참조도 있습니다. 내가Tomcat에서 새 클래스를 정의하십시오.

Class.forName("com.Class1"); 

을 다음과 같이 클래스를 확인하려고 할 때 나는

CustomClassLoader customClassLoader = new CustomClassLoader(getClass().getClassLoader()); 
/* 
    print getClass().getClassLoader() and it output as 
    WebappClassLoader 
    context: /test 
    delegate: false 
    repositories: 
    /WEB-INF/classes/ 
    ----------> Parent Classloader: 
    [email protected] 
*/ 

Class clazz = customClassLoader.loadThisClass("com.Class1"); 
//print clazz.getMethods, it print my new method. 

으로이 클래스 로더를 사용하고

class CustomClassLoader extends ClassLoader{ 
    public CustomClassLoader(ClassLoader classLoader) { 
     super(classLoader); 
    } 

    public Class loadThisClass(String name){ 
     //get .class byte array in data. 
     Class clazz = defineClass(name, data, 0, data.length, null); 
     resolveClass(clazz); 
     return clazz; 
    } 
} 

으로 내 사용자 정의 클래스 로더를 선언 나는 ClassNotFoundException가이 클래스를 얻고있다 웹 응용 프로그램의 다른 클래스에서 액세스 할 수 없습니다.

웹 응용 프로그램의 다른 클래스에서 액세스 할 수있는 새 클래스를 tomcat 웹 응용 프로그램에서 정의 할 수 있습니까?.

+0

수업 이름을 확인하셨습니까? ClassLoader의 메소드에 대한 String 매개 변수로 제공된 클래스 이름은 Java ™ 언어 사양 –

+0

에 정의 된대로 2 진 이름이어야합니다. WEB-INF/classes에있는 클래스 파일 이름은 무엇입니까 –

답변

0

충분하지 않을 수도 있지만 Classloader에서 findClass을 무시해야합니까?

보호 클래스 (때문에) findClass (문자열 이름) 는 ClassNotFoundException가

지정된 바이너리 명을 가지는 클래스를 찾습니다 발생합니다. 이 메소드는, 로드 클래스의 위양 모델에 계속되는 클래스 로더 구현에 의해 오버라이드 (override)되고, 가 요구 된 클래스의 부하 검사를 실시한 후에 loadClass 메소드에 의해 불려갑니다. 기본값 은 ClassNotFoundException을 발생시킵니다.

응답 언급합니다 :

Prohibited package name : java.lang 당신이 당신의 자신의 클래스 로더에서주는 java.lang의 패키지 공간에서 클래스를로드하는 것을 의미한다. 클래스 로더 또는 java.lang 패키지에로드하려는 클래스가 있습니까?

그렇지 않으면 클래스 로더가 너무 많이로드하려고 할 수 있습니다. findClass를 재정의 한 후에는 도메인에 있는지 확인하고 그렇지 않은 경우 throw해야합니다.

protected Class<?> findClass(String name) { 
    if(!name.startsWith("com.your.package")) throw new ClassNotFoundException(); 
} 
+0

사용자 정의 findClass 메소드를 추가했는데 작동 중입니다. 독립 실행 형 응용 프로그램에서는 문제가 없습니다. 하지만이 코드를 사용하여 Tomcat에서 클래스를로드하려고하면 예외가 발생합니다 ** 금지 된 패키지 이름 : java.lang **. Tomcat WebappClassLoader가 부모 클래스 로더에 위임하지 않기 때문에이 오류가 발생합니다. 또한 javaassist를 사용하여 WebappClassLoader에서 확장되고 setDelegate (true)를 호출하지만 여전히 ** 금지 된 패키지 **를 가져 오는 클래스를 동적으로 생성합니다. Tomcat에 새 클래스를로드하는 방법에 대해 알고 계신가요? 현재 클래스를로드하는 방법에 대한 바람둥이 코드를 찾고 있습니다. – dmay

+0

'금지 된 패키지 이름 : java.lang'은 자신의 클래스 로더에서 java.lang의 패키지 공간에 클래스를로드하려고 시도 함을 의미합니다. –

+0

내 수업이 java.lang 패키지에 없습니다. 그것은 내 사용자 지정 패키지에 있습니다. 이 문제는 java로 시작하는 클래스를 건너 뛰면 해결됩니다. 데이비드 (David)가 제안했다.내 목적은 바람둥이에로드 된 다른 클래스도 새로운 클래스에 액세스 할 수 있도록 바람둥이에 새로운 클래스를로드하는 것입니다. 내 접근 방식은 바이트 배열로 새 클래스를로드하는 사용자 정의 클래스 로더를 만드는 것이지만 불행히도 기존 클래스는 하위 클래스 로더에 의해로드되기 때문에 새로운 클래스를 볼 수 없습니다. 그러나이 방법은 잘못되었습니다. 리플렉션을 통해 WebappClassLoader 객체에서 definesClass 메서드를 호출하여 새 클래스를로드 중입니다. – dmay

관련 문제