簡體   English   中英

從單獨的jar調用.asSubclass時拋出ClassCastException

[英]ClassCastException thrown when calling .asSubclass from separate jar

我有一個程序,通過它我有以下三個類。 前兩個是在jar1.jar

Main (使用此處的jar加載技巧):

package prob1;

import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class Main {
    static List<Class<?>> classes = new ArrayList<Class<?>>();

    static String pathToJar = "/Users/vtcakavsmoace/Desktop/jar2.jar";

    public static void main(String[] args) throws ClassNotFoundException, IOException, InstantiationException, IllegalAccessException {
        loadJar();

        classes.get(0).asSubclass(A.class).newInstance().someMethod();
    }

    private static void loadJar() throws IOException, ClassNotFoundException {
        JarFile jarFile = new JarFile(pathToJar);
        Enumeration<JarEntry> e = jarFile.entries();

        URL[] urls = { new URL("jar:file:" + pathToJar + "!/") };
        URLClassLoader cl = URLClassLoader.newInstance(urls);

        while (e.hasMoreElements()) {
            JarEntry je = e.nextElement();
            if (je.isDirectory() || !je.getName().endsWith(".class")) {
                continue;
            }

            String className = je.getName().substring(0, je.getName().length() - 6);
            className = className.replace('/', '.');
            classes.add(cl.loadClass(className));
        }

        jarFile.close();
    }
}

A

package prob1;

public interface A {
    void someMethod();
}

jar2.jar找到第二個類, B

package prob2;

import prob1.A;

public class B implements A {

    @Override
    public void someMethod() {
        System.out.println("Hello, world!");
    }

}

如您所見, B類顯然實現了接口A 但是,當加載類B ,然后嘗試在其上調用asSubclass時,將失敗並出現以下異常:

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.ClassCastException: class prob2.B
    at java.lang.Class.asSubclass(Class.java:3404)
    at prob1.Main.main(Main.java:20)
    ... 5 more

請注意,在Eclipse中運行時不會失敗。

我在這做錯了什么? 我怎樣才能解決這個問題?

好的,根據Erwin Bolwidt給我的知識找到答案; Main類中,替換:

URLClassLoader cl = URLClassLoader.newInstance(urls);

有:

URLClassLoader cl = URLClassLoader.newInstance(urls, Main.class.getClassLoader());

解決了這個問題。 :P

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM