아래의 테스트 케이스. 출력 : 출력의 두 번째와 세 번째 선 사이 표시 :Java에서 클래스 분석을 위해 클래스 로더를 사용하는 방법
custom loading of: pkg.TestRun
ran.
wish this would run in my custom classloader
내가 일이 원하는 것은 "pkg.TestRun 사용자 정의로드"를 참조하는 것입니다.
부모로부터 첫 번째 클래스가로드 된 경우에도 내 맞춤 클래스 로더에서 클래스의 종속성을로드하려면 어떻게해야합니까? 내 실제 사례에서, OtherClass에 상응하는 것이 상위 클래스 로더에 알려지지 않았기 때문에 예외가 발견되지 않습니다.
한 가지 해결책은 사용자 지정 클래스 로더가 TestRun을 명시 적으로로드하는 것입니다. 그러나 TestRun을로드하는 방법은 이미 부모 클래스 로더에 알려져 있으며, 이미 완료되었으므로 별도로 찾기를 관리하고 싶지 않습니다. 내가하지 않고 이미 관리되고있을 때 어떻게 든 알아낼 수는 있습니다. 아무것도. 그리고 나는 super.getResource (null 반환) 또는 findClass (이미 부모 클래스를 클래스로 설정)와 같은 작업을 시도했지만 어느 것도 작동하지 않았습니다.
그렇다면 부모가 클래스를 찾을 수 있도록 할 수는 있지만 사용자 정의 로더가 클래스를 정의 할 수 있습니까? 또는, 의존성을 찾기 위해 항상 내 커스텀 로더를 사용할 수 있도록하는 방법이 있습니까?
package pkg;
public class TestCL {
static class MyCL extends ClassLoader {
MyCL(ClassLoader parent) {
super(parent);
}
@Override
public Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
System.out.println("custom loading of: " + name);
return getParent().loadClass(name);
}
}
public static void main(String[] args) throws Exception {
MyCL cl = new MyCL(Thread.currentThread().getContextClassLoader());
Thread.currentThread().setContextClassLoader(cl);
cl.loadClass("pkg.TestRun").getMethod("run", new Class[] {}).invoke(null);
}
}
class TestRun {
public static void run() {
System.out.println("ran.");
OtherClass.runAlso();
}
}
class OtherClass {
public static void runAlso() {
System.out.println("wish this would run in my custom classloader");
}
}
왜 사용자 정의 클래스 로더가 필요하다고 생각하십니까? – duffymo
'-verbose : class' 명령 행 옵션은 클래스 로딩 문제를 디버깅 할 때 당신의 친구입니다. – biziclop
'OtherClass의 사용자 정의로드'를 보시겠습니까? 기본 클래스 로더에서 OtherClass를로드하는 것을 찾기 위해 디버거를 사용할 것입니다. – davidfrancis