常见问题
EggG 是什么?
EggG 是一个 Java 类型元数据分析与流式反射调用工具库。它能够在运行时还原被擦除的泛型类型信息,并提供流式 API 简化反射操作、通过 Handler 机制统一注解解析。主要能力包括:泛型解析、流式反射调用、注解提炼、属性模型(getter/setter)。
Eggg 是否线程安全?
Eggg 实例是线程安全的,可以作为全局单例在多线程环境中共享使用。内部缓存使用并发安全的数据结构。
EggG 的性能如何?
EggG 在性能方面做了以下优化:
| 优化手段 | 效果 |
|---|---|
| 软引用缓存 | TypeEggg / ClassEggg 解析结果自动缓存,避免重复计算。内存紧张时自动释放 |
| MethodHandle 加速 | 公有方法使用 MethodHandle 调用,减少传统反射的权限检查开销 |
| 方法名索引 | 按方法名建立索引,O(1) 查找 |
| 构造器参数快照 | 预计算参数类型,加速匹配 |
| 精简体积 | 核心约 3600 行,启动开销小 |
解析过的类型会缓存复用,方法查找走索引,调用走 MethodHandle,在实际项目中的额外开销较小。
与 geantyref / generics-resolver 的区别?
| 特性 | EggG | geantyref | generics-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 将所有反射异常统一包装为 EgggReflectException(RuntimeException 的子类),无需处理多种受检异常:
try {
Object result = eggg.reflect(obj).call("someMethod").get();
} catch (EgggReflectException e) {
Throwable cause = e.getCause(); // 获取原始异常
}
可以在 GraalVM Native Image 中使用吗?
可以,但 GraalVM Native Image 在编译期就需要确定哪些类会被反射使用。需要:
- 提供 reflect-config.json 配置文件,声明需要反射支持的类
- 注册自定义
ReflectHandler,替代默认的运行时反射行为
ReflectHandlerDefault.setInstance(new NativeImageReflectHandler());
如何自定义注解解析?
通过 DigestHandler 和 AliasHandler 注册自定义的注解处理逻辑:
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);
}
}
更多问题
如有其他问题或建议,可以通过以下渠道反馈: