我正在尝试制作一个程序,可以从子文件夹“插件”加载一组未知的插件。所有这些插件都实现了相同的接口。我需要知道的是如何找到该文件夹中的所有类,以便我可以实例化并使用它们?
答案 0 :(得分: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 强>
一个完整的测试程序,它从“子文件夹/”加载所有类文件,并在其上实例化并运行接口方法。
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
Hello World,来自TestClass
答案 1 :(得分:1)
服务是一组众所周知的接口和(通常是抽象的)类。服务提供者是服务的特定实现。提供程序中的类通常实现接口并子类化服务本身中定义的类。服务提供者可以以扩展的形式安装在Java平台的实现中,即,将jar文件放入任何通常的扩展目录中。通过将提供者添加到应用程序的类路径或通过其他一些特定于平台的方法,也可以使提供者可用。
This article解释了详细信息。
答案 2 :(得分:0)
使用File.listFiles()查看文件夹,并使用JarClassLoader实例加载那里的类。
或者,如果它们在类路径中,则在每个jar中添加一个description.xml,并使用getClass()。getClassLoader()。findResources(“description.xml”)来加载所有描述,然后你就拥有了所有要加载的插件类。
答案 3 :(得分:0)
使用自定义注释注释您的实现类,并使用scannotation它对类文件进行字节代码扫描,并且比其他任何内容都快一些,您可以使用它来搜索整个非常大的classpath。