java - 如何从.class文件中读取Java类def?

标签 java

我正在编写Java应用程序,我想编写一些简单的插件系统。我想要有基类插件。其他类扩展了插件,这些文件位于类路径之外的其他目录中。

public class Plugin {
    public Plugin() {
        //code
    }

    public void proc() {
        //code
    }
}

和类加载器:

public class PluginLoader {
    private static final FilenameFilter filter = new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return Pattern.matches("^.*[a-zA-Z]*[.]class$", name);
        }
    };

    public static final String removeExtension(String str) {
        if (str == null)
            return null;
        int pos = str.lastIndexOf(".");
        if (pos == -1)
            return str;
        return str.substring(0, pos);
    }

    @SuppressWarnings("unchecked")
    public static LinkedList<Plugin> loadEffects(String path) {
        LinkedList<Plugin> result = new LinkedList<Plugin>();
        Plugin instance = null;
        File[] classesList = null;
        System.out.println("Searching in " + path);
        try {
            File classDir = new File(path);
            URL[] url = { classDir.toURI().toURL() };
            URLClassLoader urlLoader = new URLClassLoader(url);
            String filename;
            classesList = classDir.listFiles(filter);
            System.out.println(classesList.length + " class files found:");
            for (File file : classesList) {
                System.out.println("- " + file.getName());
            }
            for (File file : classesList) {
                filename = removeExtension(file.getName());
                if (filename.equals(".") || filename.equals("..") || filename.startsWith("."))
                    continue;
                if (filename.equals("Plugin")) {
                    System.err.println("File name is Plugin");
                    continue;
                }
                System.out.println("Reading " + filename);
                instance = (Plugin) urlLoader.findClass(filename).getConstructor().newInstance();
                System.out.println("Adding: " + url + ", " + filename);
                result.push(instance);
            }
            urlLoader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

此代码会导致java.lang.NoClassDefFoundError:D:\test\PluginImpl/class(错误名称:test/PluginImpl)。插件类位于 D:\test 中。

最佳答案

您正在调用 File#getAbsolutePath(),它将包含整个路径和驱动器号 (D:\)。类中存储的类名与您提供的类名不匹配,因此 Java 会抛出错误。

尝试仅使用类名调用 findClass,它应该可以工作

关于java - 如何从.class文件中读取Java类def?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34580490/

相关文章:

java - 托管使用Java和Rails代码的Web应用程序?

java - 如何使用反射API将数据插入H2数据库

Java + Selenium

java - 如何在 Hibernate Criteria API 中添加 SQL-Server 查询提示

java - 为什么我的 JButton 总是在 GUI 上弹出?

java - 无法使 SHA1 在 Android java 中正常工作

java - JDK 64 位还是 32 位?

Java Actionlistener 提交按钮

java - Netbeans java Swing jRadioButton setIcon 和 setSelectedIcon

java - 如何在将 blob 上传到 Blobstore 的 POST 请求中提交文本字段,并在 blob 的上传处理程序中检索它?