Java 引用正在另一个类的方法中使用的类时出现问题

Java 引用正在另一个类的方法中使用的类时出现问题,java,reflection,jar,treeview,classpath,Java,Reflection,Jar,Treeview,Classpath,我正在为我实习期间制作的一个程序制作一个Jar反射树,你动态加载一个你想在树中看到的Jar文件,通过java反射,我得到包、类和方法的名称,并将它们显示在用javafx制作的树视图中。在制作treeview之后,我使用treeview的内容填充程序的其他方面 我遇到的问题是,即使我将jar添加到我的类路径中,当在同一jar中找不到的另一个类的方法中引用一个类时,我仍然会得到noclassdeffound错误 例如,在我的类CollectionLexer中有一个方法 protected RuleC

我正在为我实习期间制作的一个程序制作一个Jar反射树,你动态加载一个你想在树中看到的Jar文件,通过java反射,我得到包、类和方法的名称,并将它们显示在用javafx制作的树视图中。在制作treeview之后,我使用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;
}
}
public类JarFileLoader扩展了URLClassLoader{
公共文件加载器(URL[]URL){
超级链接(URL);
}
私有void addFilePath(字符串路径){
path=path.replace('\\','/');
urlPath=(“jar:file:/”+path+“!/”);
试一试{
addURL(新URL(URL路径));
}捕获(格式错误的DurLexException JarPathEx){
JarPathEx.printStackTrace();
} 
}
公共树Item populateJarTree(自底向上、自底向上、字符串jarFilePath){
this.bottomUp=bottomUp;
试一试{
jarFile=新的jarFile(jarFilePath);
}捕获(IOException JarFileNotFound){
System.out.println(“在特定位置未找到Jar文件”);
}
jar=jarFile.entries();
while(jar.hasMoreElements()){
jarEntry=jar.nextElement();
if(jarEntry.isDirectory()| |!jarEntry.getName().endsWith(“.class”)){
继续;
}
className=jarEntry.getName().substring(0,jarEntry.getName().length()-6);
className=className.replace(“/”,“.”);
试一试{
addFilePath(jarFilePath);
currentClass=loadClass(类名);
populatePackage();
populateClass();
populateConstructor();
普及方法();
}捕获(NoClassDefFoundError ClassDefEx){
String additionalJarFilePath=new ClassNotFoundPrompt().getPath();
if(additionalJarFilePath!=null){
addFilePath(additionalJarFilePath);
普及方法();
}
//发生时忽略类定义错误
}捕获(ClassNotFoundException ClassNotFoundEx){
ClassNotFoundEx.printStackTrace();
}
}
返回根导入;
}
}

启动程序时,如果类路径包含所有jar,会发生什么情况?如果我在编译和运行程序之前包含所有需要的jar,它就可以正常工作,但程序的这一部分的全部要点是动态加载任何jar(也就是说,我不必事先包含它),如果发现noclassdef错误,我应该能够让用户给我缺少的jar的文件路径,这样我就可以将它添加到类路径并继续反射。您的回答表明类路径的动态扩展没有按预期工作。那么,也许我们看看你用来做这件事的代码?我用我使用的一些代码更新了我的OP我不相信方案部分“jar:file:”是正确的(不应该有嵌入的“:”,我认为结尾的“!/”对jar文件无效。有任何支持这一点的引用吗?