注解与反射结合实现组件热解耦:注解声明意图(如@Component、@Input),反射动态解析执行,平台依契约自动发现、装配、运行组件,无需硬编码依赖。

因为注解提供声明式元数据,反射提供运行时动态解析能力,二者结合让组件无需硬编码依赖就能被平台自动发现、装配和执行。
注解负责“说清楚要做什么”
自定义注解是组件的“身份证”和“说明书”。比如一个表单字段组件,用 @FormComponent(type = "date-picker", order = 10) 标记类,就明确告诉平台:这是一个日期选择器,应在第10位渲染。它不写逻辑,只声明意图——类型、优先级、适用场景等配置信息全靠属性表达。平台扫描到这个注解,就知道该加载哪个类、怎么排布、何时触发。
反射负责“现场查证并动手干活”
平台启动时,通过 Class.forName() 加载组件类,再调用 clz.getAnnotation(FormComponent.class) 拿到注解值;接着用 clz.getDeclaredMethods() 找出标记了 @Input 或 @Output 的方法,最后用 method.invoke() 动态执行。整个过程不依赖具体类名或接口实现,只要符合注解契约,新组件扔进来就能跑。
热解耦靠的是“契约不绑定实现”
传统方式中,模块A直接 new B() 或 getBean(B.class),B一改,A就得跟着改。而注解+反射方案下:
- 组件只需按约定加注解,不暴露实现细节
- 平台只认注解语义,不关心内部怎么写
- 替换组件时,只要新类保持相同注解属性和输入/输出结构,其他模块完全无感
真实组件契约示例直击本质
看这段代码:
@Component
@ComponentEndpoint(path = "/api/component/user-card")
public class UserCardComponent {
@Input("userId") private Long userId;
@Output("user") private User user;
public void onLoad() { this.user = userRepository.findById(userId).orElse(null); }
}
平台靠反射读取 @Input/@Output,就知道这个组件需要什么参数、会吐出什么数据;靠 @ComponentEndpoint 就自动注册成REST接口;根本不用在配置文件里写死类路径或手动注册Bean。这才是低代码平台能支持热插拔、免重启上线的关键。

















