Java 有没有一种简单的方法可以动态加载扩展抽象类的类?
问题: 我有一个外部用户可以实现的抽象类。这些类将在我的应用程序中使用。但是我事先不知道这些课程。我想在运行时加载它们 当前设置: 当前的设置是在jar文件中添加类,并在运行程序时将它们添加到类路径中。然后,程序在类路径中搜索任何类文件,并查看它们是否是抽象的,而不是接口,以及它们是否可以从该类分配抽象类Java 有没有一种简单的方法可以动态加载扩展抽象类的类?,java,dynamic,classloader,Java,Dynamic,Classloader,问题: 我有一个外部用户可以实现的抽象类。这些类将在我的应用程序中使用。但是我事先不知道这些课程。我想在运行时加载它们 当前设置: 当前的设置是在jar文件中添加类,并在运行程序时将它们添加到类路径中。然后,程序在类路径中搜索任何类文件,并查看它们是否是抽象的,而不是接口,以及它们是否可以从该类分配抽象类 将jar文件添加到类路径 启动程序 对于类路径中的每个(类或jar文件中的类) 检查抽象类是否可从类和 类不是抽象的,不是接口 有没有一个图书馆或者简单的方法可以做到这一点?恐怕这段代码有
- 将jar文件添加到类路径
- 启动程序
- 对于类路径中的每个(类或jar文件中的类)
- 检查抽象类是否可从类和
- 类不是抽象的,不是接口
private static <T> Class<? extends T> loadSubclasses(Class<T> superClass)
私有静态类“加载”类是什么意思?正如您所建议的,泛型肯定不会在运行时执行类似的操作,至少是为了确保编译时的安全。根据您实际想要做的事情,反思可能是解决方案。您的问题可能已经得到了回答1,2.检查类:AbstractPlugin.class.isAssignableFrom(clazz)
,Modifier.isInterface(clazz.getModifiers())
,Modifier.isassistract(clazz.getModifiers())
3。您应该使用一个特殊的插件目录并检查它是否有任何更改,或者您必须在类路径中保留所有以前扫描过的JAR的列表并进行检查以缩短启动时间。已解决。请参阅更新部分。谢谢你的关注。
public static <T> Set<Class<? extends T>>
loadSubClasses(Class<T> superClass) {
return loadSubClasses(superClass,
ClasspathHelper.staticClassLoader());
}
public static <T> Set<Class<? extends T>> loadSubClasses(
Class<T> superClass, ClassLoader classLoader) {
Reflections reflections = new Reflections(classLoader);
return reflections.getSubTypesOf(superClass);
}