我正在为我实习的程序制作一个Jar反射器树,你想要在树中看到动态加载一个jar文件,并通过java反射我得到包,类和方法的名称并显示它们在用javafx制作的treeView中。在树视图制作完成后,我使用树视图的内容来填充我的程序的其他方面。
我遇到的问题是,即使我将jar添加到我的类路径中,当在同一个jar中找不到的另一个类的方法中引用类时,仍然会出现noclassdeffound错误。
例如在我的类CollectionLexer中有一个方法
protected RuleContext parse(VocabularyStatementParser p) {
return p.collection();
}
当我调用(CollectionLexer全名).getDeclaredMethods()时,它会为RuleContext抛出一个noclassdeffound错误,该错误位于另一个jar中。
现在,我已经能够动态地将RuleContext所在的jar添加到类路径中,但是当我尝试再次获取CollectionLexer的方法时,它仍然会抛出一个noclassdeffound错误。
public class JarFileLoader extends URLClassLoader {
public JarFileLoader(URL[] urls) {
super(urls);
}
private void addFilePath(String path) {
path = path.replace('\\', '/');
urlPath = ("jar:file:/" + path + "!/");
try {
addURL(new URL(urlPath));
} catch (MalformedURLException JarPathEx) {
JarPathEx.printStackTrace();
}
}
public TreeItem<String> populateJarTree(BottomUp bottomUp, String jarFilePath) {
this.bottomUp = bottomUp;
try {
jarFile = new JarFile(jarFilePath);
} catch (IOException JarFileNotFound) {
System.out.println("Jar File Not Found At Specific Location.");
}
jar = jarFile.entries();
while (jar.hasMoreElements()) {
jarEntry = jar.nextElement();
if (jarEntry.isDirectory() || !jarEntry.getName().endsWith(".class")) {
continue;
}
className = jarEntry.getName().substring(0, jarEntry.getName().length() - 6);
className = className.replace('/', '.');
try {
addFilePath(jarFilePath);
currentClass = loadClass(className);
populatePackage();
populateClass();
populateConstructor();
populateMethod();
} catch (NoClassDefFoundError ClassDefEx) {
String additionalJarFilePath = new ClassNotFoundPrompt().getPath();
if (additionalJarFilePath != null) {
addFilePath(additionalJarFilePath);
populateMethod();
}
//Ignore class def error when it occurs
} catch (ClassNotFoundException ClassNotFoundEx) {
ClassNotFoundEx.printStackTrace();
}
}
return rootImport;
}
}