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

时间:2014-04-19 07:16:11

标签: java reflection jar javassist

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

2 个答案:

答案 0 :(得分:1)

  在非Windows操作系统上抛出

异常

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

答案 1 :(得分:0)

无法找到并导致异常的类是

javassist.util.proxy.ProxyObject

您确定在非Windows操作系统上的类路径上有正确的jar吗?代理对象接口由javassist创建的任何类实现。它似乎对类加载器不可见。您是否尝试定义明确的class loader provider

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