Java从具有依赖关系的另一个Jar创建Java类实例

问题描述 投票:0回答:1

我正在尝试从另一个jar创建类的实例,问题是所有类都与我的类不同,因此,如果我尝试调用需要Test.class的方法,则会收到IllegalArgumentException

[我尝试过从路径中提取JarFile,检查以确保它是一个类(我检查jar中的每个类),使用jar路径和我的jar路径创建URLClassLoader,并使用URLClassLoader加载该类,然后选中确保它具有正确的超类,然后将其存储在列表中以备后用。

现在我不能对子类做任何事情,我不能将其强制转换为超类,因为它是通过另一个加载器加载的。

if(folder.listFiles() == null) return;
        for(File files : folder.listFiles()) {
            if(files.getName().endsWith(".jar")) {
                try {
                    JarFile jarFile = new JarFile(files.getAbsolutePath());
                    Enumeration<JarEntry> enumerator = jarFile.entries();

                    URL[] urls = {new URL("jar:file:" + files.getAbsolutePath() + "!/"), new URL("jar:file:" + CurrentClass.class.getProtectionDomain().getCodeSource().getLocation()
                            .toURI().getPath() + "!/")};
                    URLClassLoader cl = URLClassLoader.newInstance(urls);
                    while (enumerator.hasMoreElements()) {
                        JarEntry file = enumerator.nextElement();
                        if (file.isDirectory() || !file.getName().endsWith(".class")) {
                            continue;
                        }

                        String className = file.getName().substring(0, file.getName().length() - 6);
                        className = className.replace('/', '.');
                        Class clazz = cl.loadClass(className);
                        if(clazz.getSuperclass().getName().equals(MyClass.class.getName())) {
                            found.add(clazz);
                        }
                    }
                } catch (Exception e) {
                    logger.severe("Could not load jar at path: " + enchants.getPath());
                    logger.log(Level.SEVERE, e, () -> "Error:");
                }
            }
        }

返回的类不是同一类的子类,因此我不能做太多事情。如何使用正确的超类加载它?或者我该如何将其投放到超类?

[经过更多的尝试,我尝试避免进行任何强制转换,但无法完全避免。如果可以通过某种方式进行常规转换或某种方式可以正常工作,则只需将其保存到列表中,并从其他jar中加载其他类。

由于不清楚,这里是一个更好的解释

Jar A需要从jar B创建类的实例。jar B中的类必须是Jar A中类的子类,因为我将它们添加到列表中,并且不能将其添加为依赖项。

java
1个回答
0
投票

很抱歉,我发现我必须将原始类加载器传递给子类加载器,以为其提供原始超类的正确Class实例。

© www.soinside.com 2019 - 2024. All rights reserved.