Java-如何从JAR动态实例化抽象类



我正试图使用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有问题?它应该是独立于平台的,但根据操作系统的不同,它可能会运行,也可能不会运行。

在非windows操作系统上此处引发异常

这是一个很大的线索,表明某个地方存在资本差异。与Windows一起使用的主要文件系统不区分大小写,而其他地方使用的主要的文件系统(*nix)区分大小写。因此,请非常仔细地查看您试图加载的资源的大小写,并确保您加载的资源在代码中的大小写与在jar或文件系统中完全相同。

找不到并导致异常的类是

javassist.util.proxy.ProxyObject

你确定在非Windows操作系统上的类路径上有正确的jar吗?代理对象接口由javassist创建的任何类实现。类加载器似乎看不到它。您是否尝试定义一个显式类加载器提供程序?

我同意另一个答案,即套管是最可能的原因。你能提供运行应用程序的命令和jar的确切文件名吗?

最新更新