我正在尝试编写一个程序,可以从子文件夹“插件”中加载一个未知的插件集合。这些插件都实现了相同的接口。我需要知道的是如何找到该文件夹中的所有类,以便我可以实例化并使用它们?
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
服务是一组众所周知的接口和(通常是抽象的)类。服务提供者是服务的具体实现。提供者中的类通常实现服务本身中定义的接口并子类化类。服务提供者可以以扩展的形式安装在Java平台的实现中,即将jar文件放置在任何常规扩展目录中。提供者也可以通过将它们添加到应用程序的类路径或通过其他特定于平台的方式使其可用。
本文详细解释了细节。
使用File.listFiles()浏览文件夹,并使用JarClassLoader实例加载其中的类。
或者,如果它们在类路径上,则在每个jar中添加description.xml,并使用getClass().getClassLoader().findResources("description.xml")加载所有描述,然后您就可以加载所有插件类了。