我正在尝试使用Javassist加载一个在运行时从JAR文件动态加载的抽象方法类。出于某种原因,此代码仅在Windows操作系统上运行。我在任何其他平台上得到ClassDefNotFoundException。这是我使用的代码。
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是一个问题?它应该是独立于平台的,但是根据操作系统的不同,它可能运行也可能不运行。
答案 0 :(得分:1)
在非Windows操作系统上抛出异常
这是一个很大的线索,暗示某处存在资本化差异。 Windows使用的主要文件系统不区分大小写,而其他地方使用的主要文件系统(* nix)区分大小写。因此,请仔细查看您尝试加载的资源的大小写,并确保您加载的内容与您在jar或文件系统中的代码具有完全相同的大小写。
答案 1 :(得分:0)
无法找到并导致异常的类是
javassist.util.proxy.ProxyObject
您确定在非Windows操作系统上的类路径上有正确的jar吗?代理对象接口由javassist创建的任何类实现。它似乎对类加载器不可见。您是否尝试定义明确的class loader provider?
我同意另一个答案,即套管是最可能的原因。您能提供运行应用程序的命令以及罐子的确切文件名吗?