
### 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 = **G**eneric **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 引入）来获取方法参数的名字和类型信息。

### 如何清除缓存？

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

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

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

### 如何处理反射异常？

EggG 将所有反射异常统一包装为 `EgggReflectException`（`RuntimeException` 的子类），无需处理多种受检异常：

```java
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`**，替代默认的运行时反射行为

```java
ReflectHandlerDefault.setInstance(new NativeImageReflectHandler());
```

### 如何自定义注解解析？

通过 `DigestHandler` 和 `AliasHandler` 注册自定义的注解处理逻辑：

- `DigestHandler`：从注解中提炼信息
- `AliasHandler`：生成字段/参数别名

详细用法参见 [注解提炼与别名](../guide/annotation-distill.md)。

### 有没有 Spring Boot 的集成方案？

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

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

### 更多问题

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

- [Gitee Issues](https://gitee.com/noear/eggg/issues)
- [GitHub Issues](https://github.com/noear/eggg/issues)
- [DeepWiki](https://deepwiki.com/noear/eggg)
