동적으로로드 된 jar 파일에서 클래스를로드하려고합니다. 현재 루트 클래스 Object가 아닌 클래스로 확장되지 않는 클래스를로드 할 수 있지만 사용자 정의 클래스를 확장하는 클래스를로드 할 수 없습니다. 내 문제에 대한 자세한 설명은 다음과 같습니다. I가 프로젝트 A를 수출동적으로로드 된 jar 파일에서 수퍼 클래스로 Java 클래스로드
class B1 {
}
class B2 extends A {
}
: 프로젝트 B에서
class A {
}
, 클래스 B1과 같은 클래스 B2가 있습니다 :
프로젝트 A의는 클래스 A가 같이있다 a.jar, 프로젝트 B를 b.jar로 변경하십시오. 테스트 코드는 다음과 같습니다
File f = new File("Z:\\Jars\\b.jar");
URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { f.toURL() },
System.class.getClassLoader());
Class<?> classB1 = (Class<?>) urlClassLoader.loadClass("b.B1");
System.out.println("B1 is loaded");
Class<?> classB2 = (Class<?>) urlClassLoader.loadClass("b.B2");
System.out.println("B2 is loaded");
클래스 B1이 성공적으로로드되어 있지만 클래스 B2 인해 클래스 a.A에로드되지 않습니다 발견되지 않는 예외 :
java -cp a.jar;b.jar; a.Main
B1 is loaded
Exception in thread "main" java.lang.NoClassDefFoundError: a/A
Caused by: java.lang.ClassNotFoundException: a.A
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 12 more
가 어떻게이 문제를 해결할 수 있습니까? 감사합니다. .
추신. 에 a.jar를 포함하여, 클래스 B2로드 있지만 다음 테스트에 실패 할 수있다 :
Class<A> classB2 = (Class<A>) urlClassLoader.loadClass("b.B2");
A ab2 = classB2.newInstance();
첫 번째 라인은 미세하지만 두 번째 줄에 다음과 같은 예외 트리거 :
Exception in thread "main" java.lang.ClassCastException: b.B2 cannot be cast to a.A
at a.Main.main(Main.java:22)
B2 인을 A 인스턴스, 왜 이런 일이 일어 났는지 생각해?
클래스 A를 포함하지 않고 jar b.jar을 어떻게 작성 하시겠습니까? b.jar에서 A.class를 수동으로 제거 하시겠습니까? – Mahesh
Eclipse를 사용 중이 었는데 프로젝트 B를 프로젝트 A에 의존하도록 설정 했으므로 프로젝트 B를 빌드하고 jar 파일을 내보낼 수 있습니다. 위의 데모 케이스의 경우 a.jar를 포함하여 문제가 해결되었으며 클래스 B2를로드하고 A로 캐스팅 할 수 있습니다. – DeepParticle
http://stackoverflow.com/questions/2591779/cast-across-classloader의 첫 번째 대답은 다음과 같습니다. 서로 다른 클래스 로더에 의해로드 된 동일한 클래스의 클래스를 서로 캐스팅 할 수 없다는 점입니다. – DeepParticle