我正嘗試使用Javassist來加載從運行時從JAR文件動態加載的抽象方法類。出於某種原因,此代碼只能在Windows操作系統上運行。我在任何其他平臺上遇到ClassDefNotFoundException。這是我使用的代碼。Java - 如何動態實例化JAR中的抽象類?
public static void example() throws Exception {
String pathToJar = "pathToJar.jar";
File JARFile = new File(pathToJar);
ClassLoader classLoader = URLClassLoader.newInstance(new URL[]{ JARFile.toURI().toURL() });
Class<?> callBackClass = classLoader.loadClass("package.Callback");
ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(callBackClass);
MethodHandler handler = new MethodHandler() {
@Override
public Object invoke(Object self, Method overridden, Method forwarder,
Object[] args) throws Throwable {
return forwarder.invoke(self, args);
}
};
factory.setFilter(
new MethodFilter() {
@Override
public boolean isHandled(Method method) {
return Modifier.isAbstract(method.getModifiers());
}
}
);
Object instance = factory.create(new Class<?>[0], new Object[0], handler); /*exception thrown here on non-windows OS*/
}
這是類加載器的問題嗎?或者它是Javassist的問題?它應該與平臺無關,但取決於操作系統,它可能運行也可能不運行。
什麼是抽象的? – Batty
上述代碼中顯示的方法處理程序是抽象類。它覆蓋了invoke()方法,該方法應該被轉發給動態加載的方法類。問題是我行,factory.create()方法g – user3435571
異常堆棧跟蹤,請。 – chrylis