native RuntimeNativeRegistrar API 参考
2026年8月12日 上午11:30:12
RuntimeNativeRegistrar 是 Solon AOT 提供的手动登记接口,用于补充框架自动处理不到的原生元信息(第三方框架的反射、资源、序列化等)。本页是完整 API 参考,用法示例见 《native 项目开发定制》。
1、接口定义
public interface RuntimeNativeRegistrar {
void register(AppContext context, RuntimeNativeMetadata metadata);
}
实现类注册为 Solon 组件(@Component)即可,AOT 阶段会自动收集并调用:
@Component
public class RuntimeNativeRegistrarImpl implements RuntimeNativeRegistrar {
@Override
public void register(AppContext context, RuntimeNativeMetadata metadata) {
// ...登记
}
}
2、RuntimeNativeMetadata 方法一览
所有方法返回 this,可链式调用。
2.1 反射登记
| 方法 | 说明 |
|---|---|
registerReflection(Class<?> type, MemberCategory... categories) | 按成员类别登记反射 |
registerReflection(String className, MemberCategory... categories) | 同上(按类名字符串) |
registerReflection(Class<?> type, Consumer<ReflectionHints> typeHint) | 细粒度登记(可追加字段/方法/构造器明细) |
registerReflection(String className, Consumer<ReflectionHints> typeHint) | 同上(按类名字符串) |
registerField(Field field) | 登记单个字段 |
registerConstructor(Constructor<?> c, ExecutableMode mode) | 登记单个构造器 |
registerMethod(Method m, ExecutableMode mode) | 登记单个方法 |
registerAllDeclaredMethod(Class<?> clazz, ExecutableMode mode) | 登记类上所有声明方法 |
registerDefaultConstructor(Class<?> clazz) | 登记默认构造(不存在则不登记) |
registerDefaultConstructor(String className) | 同上(按类名字符串) |
2.2 资源登记
| 方法 | 说明 |
|---|---|
registerResourceInclude(String pattern) | 登记包含的资源(正则表达式) |
registerResourceInclude(String pattern, String reachableType) | 同上(带条件类) |
registerResourceExclude(String pattern) | 登记排除的资源 |
registerResourceExclude(String pattern, String reachableType) | 同上(带条件类) |
2.3 序列化与代理登记
| 方法 | 说明 |
|---|---|
registerSerialization(Class<?> type) | 登记 Java 序列化类 |
registerSerialization(String name) | 同上(按全类名) |
registerSerialization(Package basePackage) | 登记整个包下所有类(会扫描类文件) |
registerSerialization(Class<?> type, String reachableType) | 带条件类 |
registerLambdaSerialization(Class<?> type) | 登记 lambda 序列化(对应 lambdaCapturingTypes) |
registerJdkProxy(Class<?> type) | 登记 JDK 代理接口(写入 proxy-config.json) |
registerJdkProxy(Class<?> type, String reachableType) | 同上(带条件类) |
2.4 其它
| 方法 | 说明 |
|---|---|
registerArg(String... args) | 追加 native-image 构建参数(写入 native-image.properties) |
setApplicationClassName(String) | 设置应用主类(一般不用手动设置) |
3、MemberCategory(成员类别,共 12 个)
| 类别 | 生成的配置 | 含义 |
|---|---|---|
PUBLIC_FIELDS | allPublicFields | 公有字段(含继承的) |
DECLARED_FIELDS | allDeclaredFields | 声明的字段(不含继承的) |
INTROSPECT_PUBLIC_CONSTRUCTORS | queryAllPublicConstructors | 公有构造器可查询(不可调用) |
INTROSPECT_DECLARED_CONSTRUCTORS | queryAllDeclaredConstructors | 声明构造器可查询 |
INVOKE_PUBLIC_CONSTRUCTORS | allPublicConstructors | 公有构造器可调用 |
INVOKE_DECLARED_CONSTRUCTORS | allDeclaredConstructors | 声明构造器可调用 |
INTROSPECT_PUBLIC_METHODS | queryAllPublicMethods | 公有方法可查询(含继承的) |
INTROSPECT_DECLARED_METHODS | queryAllDeclaredMethods | 声明方法可查询 |
INVOKE_PUBLIC_METHODS | allPublicMethods | 公有方法可调用(含继承的) |
INVOKE_DECLARED_METHODS | allDeclaredMethods | 声明方法可调用 |
PUBLIC_CLASSES | allPublicClasses | 公有内部类可用(getClasses()) |
DECLARED_CLASSES | allDeclaredClasses | 声明内部类可用(getDeclaredClasses()) |
区别:INTROSPECT(查询) 只是能拿到元信息;INVOKE(调用) 是能真正执行反射调用。只读反射用 INTROSPECT 即可,别滥用 INVOKE(会增大镜像体积)。
4、ExecutableMode(执行模式)
| 枚举 | 生成的配置 | 含义 |
|---|---|---|
INTROSPECT | queriedMethods / 查询类 | 只查询元信息,不调用 |
INVOKE | methods / 调用类 | 可反射调用 |
5、reachableType(条件登记)
registerReflection / registerResourceInclude / registerSerialization / registerJdkProxy 均支持 reachableType(条件类)。只有该类可达时,登记才生效,对应生成 condition.typeReachable:
metadata.registerReflection("com.example.OnlyOnFoo",
MemberCategory.INVOKE_DECLARED_CONSTRUCTORS);
// 带条件:
metadata.registerResourceInclude("special/.*", "com.example.MyStarter");
作用:按需裁剪元数据,缩小 native 镜像体积;一般用户用不上,第三方面向多场景的 starter 会用到。
6、完整示例(nginxWebUI 改造片段)
@Component
public class RuntimeNativeRegistrarImpl implements RuntimeNativeRegistrar {
@Override
public void register(AppContext context, RuntimeNativeMetadata metadata) {
// 资源
metadata.registerResourceInclude("acme.zip");
metadata.registerResourceInclude("nginx.conf");
metadata.registerResourceInclude("messages_en_US.properties");
// 序列化
metadata.registerSerialization(JsonResult.class);
metadata.registerSerialization(Server.class.getPackage());
// 反射
metadata.registerReflection(ProviderFactory.class, MemberCategory.INVOKE_DECLARED_METHODS);
metadata.registerReflection(BufferedImage.class,
MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
MemberCategory.INVOKE_DECLARED_METHODS);
}
}