Solon v3.10.7

常见问题

</> markdown
2026年5月29日 上午9:14:49

EggG 是什么?

EggG 是一个 Java 类型元数据分析与流式反射调用工具库。它能够在运行时还原被擦除的泛型类型信息,并提供流式 API 简化反射操作、通过 Handler 机制统一注解解析。主要能力包括:泛型解析、流式反射调用、注解提炼、属性模型(getter/setter)。

Eggg 是否线程安全?

Eggg 实例是线程安全的,可以作为全局单例在多线程环境中共享使用。内部缓存使用并发安全的数据结构。

EggG 的性能如何?

EggG 在性能方面做了以下优化:

优化手段效果
软引用缓存TypeEggg / ClassEggg 解析结果自动缓存,避免重复计算。内存紧张时自动释放
MethodHandle 加速公有方法使用 MethodHandle 调用,减少传统反射的权限检查开销
方法名索引按方法名建立索引,O(1) 查找
构造器参数快照预计算参数类型,加速匹配
精简体积核心约 3600 行,启动开销小

解析过的类型会缓存复用,方法查找走索引,调用走 MethodHandle,在实际项目中的额外开销较小。

与 geantyref / generics-resolver 的区别?

特性EggGgeantyrefgenerics-resolver
泛型解析支持支持支持
流式反射调用支持不支持不支持
注解提炼机制支持不支持不支持
别名机制支持不支持不支持
构造器创造器支持不支持不支持
属性模型支持(getter/setter)不支持不支持
Record 支持支持未知未知
零依赖
JDK 8 兼容

geantyref 和 generics-resolver 专注于泛型解析,EggG 在此基础上还提供了流式反射调用、注解处理和属性模型。

为什么叫 EggG?

EggG = Generic Egg,即「泛型蛋」。泛型信息在编译后被擦除,外在表现相同但实际包含不同的类型参数,EggG 的作用是将这些被隐藏的类型信息还原出来。

支持 Kotlin / Scala 吗?

EggG 基于标准 Java 反射 API,理论上支持任何编译为 JVM 字节码的语言。但 Kotlin 和 Scala 有各自的属性系统和注解机制,部分场景可能需要编写自定义 Handler 适配。例如 Kotlin 的属性编译后会自动生成 getter/setter,EggG 的属性模型可以直接识别。

JDK 7 及以下能用吗?

不支持。EggG 最低要求 JDK 8,因为内部使用了 java.lang.reflect.Parameter(JDK 8 引入)来获取方法参数的名字和类型信息。

如何清除缓存?

eggg.clear(); // 清除所有 TypeEggg 和 ClassEggg 缓存

底层使用软引用,JVM 内存不足时会自动回收。在热部署等需要重新加载类的场景下,可以手动清除。

如果需要精确清理(例如热插拔项目),也可以使用 remove 系列方法按类型、类加载器或包名移除缓存。

如何处理反射异常?

EggG 将所有反射异常统一包装为 EgggReflectExceptionRuntimeException 的子类),无需处理多种受检异常:

try {
    Object result = eggg.reflect(obj).call("someMethod").get();
} catch (EgggReflectException e) {
    Throwable cause = e.getCause(); // 获取原始异常
}

可以在 GraalVM Native Image 中使用吗?

可以,但 GraalVM Native Image 在编译期就需要确定哪些类会被反射使用。需要:

  1. 提供 reflect-config.json 配置文件,声明需要反射支持的类
  2. 注册自定义 ReflectHandler,替代默认的运行时反射行为
ReflectHandlerDefault.setInstance(new NativeImageReflectHandler());

如何自定义注解解析?

通过 DigestHandlerAliasHandler 注册自定义的注解处理逻辑:

  • DigestHandler:从注解中提炼信息
  • AliasHandler:生成字段/参数别名

详细用法参见 注解提炼与别名

有没有 Spring Boot 的集成方案?

EggG 不依赖任何框架,可以在 Spring Boot 项目中直接使用。也可以将其封装为 Spring Bean:

@Configuration
public class EgggConfig {
    @Bean
    public Eggg eggg() {
        return new Eggg()
            .withDigestHandler(this::doDigestHandle)
            .withAliasHandler(this::doAliasHandle);
    }
}

更多问题

如有其他问题或建议,可以通过以下渠道反馈: