我正在尝试从另一个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中类的子类,因为我将它们添加到列表中,并且不能将其添加为依赖项。
很抱歉,我发现我必须将原始类加载器传递给子类加载器,以为其提供原始超类的正确Class实例。