如何访问子文件夹中的Java类

3

我正在尝试编写一个程序,可以从子文件夹“插件”中加载一个未知的插件集合。这些插件都实现了相同的接口。我需要知道的是如何找到该文件夹中的所有类,以便我可以实例化并使用它们?

4个回答

2

MyInterface.java

这是一个存根接口。

package test;
public interface MyInterface {
    public void printSomething();
}

TestClass.java

这是一个测试类,用于加载并实现你的接口。

import test.MyInterface;
public class TestClass implements MyInterface {
    public void printSomething() {
        System.out.println("Hello World, from TestClass");
    }
}

(编译后的类文件放置在“subfolder/”中。)


Test.java

一个完整的测试程序,从“subfolder/”加载所有类文件,并实例化并运行其中的接口方法。

package test;
import java.io.File;

public class Test {
    public static void main(String[] args) {

        try {
            ClassLoader cl = ClassLoader.getSystemClassLoader();
            File subfolder = new File("subfolder");

            for (File f : subfolder.listFiles()) {
                String s = f.getName();
                System.out.println("Loading " + s);
                Class cls = cl.loadClass(s.substring(0, s.lastIndexOf('.')));

                MyInterface o = (MyInterface) cls.newInstance();
                o.printSomething();
            }
        } catch (ClassNotFoundException e) {
        } catch (InstantiationException e) {
        } catch (IllegalAccessException e) {
        }
    }
}

上述测试程序的输出结果:

正在加载 TestClass.class
你好,世界,来自 TestClass


这个解决方案是否依赖于打包? - Lord Jragon

1

检查java.util.ServiceLoader

服务是一组众所周知的接口和(通常是抽象的)类。服务提供者是服务的具体实现。提供者中的类通常实现服务本身中定义的接口并子类化类。服务提供者可以以扩展的形式安装在Java平台的实现中,即将jar文件放置在任何常规扩展目录中。提供者也可以通过将它们添加到应用程序的类路径或通过其他特定于平台的方式使其可用。

本文详细解释了细节。


0

使用File.listFiles()浏览文件夹,并使用JarClassLoader实例加载其中的类。

或者,如果它们在类路径上,则在每个jar中添加description.xml,并使用getClass().getClassLoader().findResources("description.xml")加载所有描述,然后您就可以加载所有插件类了。


0

使用自定义注释对您的实现类进行注释,并使用scannotation进行字节码扫描,它比其他任何东西都快得多,您可以使用它立即搜索非常大的类路径的全部内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接