Solon v4.0.5

native RuntimeNativeRegistrar API 参考

</> markdown
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_FIELDSallPublicFields公有字段(含继承的)
DECLARED_FIELDSallDeclaredFields声明的字段(不含继承的)
INTROSPECT_PUBLIC_CONSTRUCTORSqueryAllPublicConstructors公有构造器可查询(不可调用)
INTROSPECT_DECLARED_CONSTRUCTORSqueryAllDeclaredConstructors声明构造器可查询
INVOKE_PUBLIC_CONSTRUCTORSallPublicConstructors公有构造器可调用
INVOKE_DECLARED_CONSTRUCTORSallDeclaredConstructors声明构造器可调用
INTROSPECT_PUBLIC_METHODSqueryAllPublicMethods公有方法可查询(含继承的)
INTROSPECT_DECLARED_METHODSqueryAllDeclaredMethods声明方法可查询
INVOKE_PUBLIC_METHODSallPublicMethods公有方法可调用(含继承的)
INVOKE_DECLARED_METHODSallDeclaredMethods声明方法可调用
PUBLIC_CLASSESallPublicClasses公有内部类可用(getClasses()
DECLARED_CLASSESallDeclaredClasses声明内部类可用(getDeclaredClasses()

区别:INTROSPECT(查询) 只是能拿到元信息;INVOKE(调用) 是能真正执行反射调用。只读反射用 INTROSPECT 即可,别滥用 INVOKE(会增大镜像体积)。

4、ExecutableMode(执行模式)

枚举生成的配置含义
INTROSPECTqueriedMethods / 查询类只查询元信息,不调用
INVOKEmethods / 调用类可反射调用

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);
    }
}