내가 다음과 같이 동작 URLClassLoader를 만들려고 노력하고있어 :URLClassLoader가 다음과 같이 동작하도록하려면 어떻게해야합니까?
이름이 흠 주어진 세트에있는 클래스에 대해 묻는다면- ,
- 그렇지 않으면 정상으로로드하는을 반환 더미 클래스
나는 이것을 얻을 수 없다. 아래의 시도에서 나는 을 성공적으로로드 할 것을 SpecialClassLoader
이 기대합니다. 이렇게하면 Test$SuperThing
을로드하려고 시도하고 더미 클래스 Nothing
이 대신로드된다는 사실에 대해 정상적인 것으로 기대됩니다.
그러나 무엇인가가 잘못되어 Test$SuperThing
을 찾고 NoClassDefFoundError
을 던집니다.
누구든지 해결 방법을 알고 있습니까?
public class Test {
private static class SuperThing {}
private static class Thing extends SuperThing {}
public static void main(String[] args) {
Set<String> inclusions = new HashSet<String>();
inclusions.add("Test$Thing"); // note Test$SuperThing is excluded
URLClassLoader cl = (URLClassLoader)
Thread.currentThread().getContextClassLoader();
SpecialClassLoader cll =
new SpecialClassLoader(cl.getURLs(), inclusions);
try {
cll.loadClass("Test$Thing"); // line 22 (see stacktrace below)
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static class Nothing {}
private static final class SpecialClassLoader extends URLClassLoader {
private final Set<String> inclusions;
public SpecialClassLoader(URL[] urls, Set<String> inclusions) {
super(urls);
this.inclusions = inclusions;
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if (inclusions.contains(name)) {
return findClass(name); // line 40 (see stacktrace below)
}
return Nothing.class;
}
}
}
편집 :
Exception in thread "main" java.lang.NoClassDefFoundError: Test$SuperThing at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) at java.net.URLClassLoader.access$000(URLClassLoader.java:56) at java.net.URLClassLoader$1.run(URLClassLoader.java:195) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at Test$SpecialClassLoader.loadClass(Test.java:40) at Test.main(Test.java:22)
오류 StackTrace하시기 바랍니다. findClass() 메소드는 제공된 케이스를 기반으로 호출 될 것입니다. –
stacktrace를 추가했습니다. 나는 findClass()를 재정의하지 않았다. – NellerLess
코드에서 findClass() 라인이 호출되어서는 안되는 것처럼 보이지만, 무엇인가 이유가 있습니다. 디버거 또는 print out 문을 사용하여 오류가 없는지 확인하십시오. 그렇다면 그 이유를 알아 내려고 노력하십시오. –