无法引用正在另一个类的方法中使用的类

时间:2014-07-30 14:57:17

标签: java reflection jar treeview classpath

我正在为我实习的程序制作一个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;
}
}

0 个答案:

没有答案