Java可通过纯JDK反射实现轻量级插件化:扫描classpath下.class文件,加载类并检查@AutoLoad等运行时注解,过滤非普通类,校验是否实现Plugin接口,再实例化调用start()。
在 Java 中,可以通过反射扫描类路径下所有类,筛选出标注了指定注解的类,并动态加载、实例化它们,从而实现轻量级插件化。核心在于:类路径扫描 + 注解识别 + 反射创建实例。关键点是不能依赖 Spring 等框架,纯 JDK 实现,且需注意类加载、异常处理和接口契约。
扫描 classpath 下所有类(不依赖第三方库)
Java 本身不提供直接列出所有已加载或可加载类的 API,因此需手动解析 classpath(如 jar 包和目录),遍历 .class 文件并提取类名。常用方式是读取
获取根路径,再递归扫描:
对每个 URL,若为
协议,按目录递归查找
文件;若为
协议,用
解析 entries
将文件路径转为二进制类名(如
→
)
跳过内部类(含
)、匿名类、接口、枚举等非普通类
加载类并检查是否标注目标注解
获取类名后,用当前类加载器(
)调用
加载 Class 对象,再通过
判断是否标注了你的插件注解:
务必捕获
和
—— 某些类可能依赖未引入的库,加载失败应静默跳过
推荐先用
做快速判断,避免触发类初始化(除非你明确需要 static 块执行)
注解需声明
,否则反射不可见
实例化并校验类型契约
找到匹配类后,调用
创建实例。但插件系统必须约定统一接口(如
),否则无法统一调用:
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
实例化前建议检查
,确保该类实现了插件接口
若构造器有参数,需提前准备参数值(可结合自定义注解如
或配置文件注入)
捕获
、
、
并记录日志,避免单个插件失败阻断整个加载流程
简单示例:@AutoLoad 插件机制
定义注解:
定义接口:
某插件类:
扫描并加载后,即可遍历所有
实例统一调用
—— 这就是最简插件化落地形态。
ClassLoader.getResource("")file:*.classjar:JarFilecom/example/PluginA.classcom.example.PluginA$getClass().getClassLoader()loadClass(String)isAnnotationPresent(YourPlugin.class)ClassNotFoundExceptionNoClassDefFoundErrorClass.getDeclaredAnnotations()@Retention(RetentionPolicy.RUNTIME)clazz.getDeclaredConstructor().newInstance()PluginPlugin.class.isAssignableFrom(clazz)@PluginParamInstantiationExceptionIllegalAccessExceptionInvocationTargetException@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface AutoLoad {}public interface Plugin { void start(); }@AutoLoad
public class LogPlugin implements Plugin {
public void start() { System.out.println("Logging plugin loaded"); }
}Pluginstart()