一枚「蛋」的诞生如果你写过框架级代码肯定经历过这样的绝望为搞清楚 List 里的类型在 Type、ParameterizedType、TypeVariable 的迷宫中绕了两小时最后写出一堆第二天自己都看不懂的反射代码。[EggG](https://github.com/noear/eggg) 是个 Java 类型元数据分析与构建工具也是流式反射调用框架。它名字有趣Egg 译为「蛋」寓意「孵化」出类型信息里隐藏的所有细节。这个项目由 Solon 框架作者 noear 发起已在 Solon、Snack4 等知名框架中作为核心基础设施使用。它用约 3600 行精炼代码把 Java 泛型反射做到了优雅又完整。它能做什么1. 一行代码看透泛型不用手动拆解 ParameterizedTypeEggG 能完成从类型声明到实际泛型参数的全链路分析javaEggg eggg new Eggg();TypeEggg typeEggg eggg.getTypeEggg(new HashMapInteger, UserModel() {}.getClass());if (typeEggg.isMap() typeEggg.isParameterizedType()) { Type keyType typeEggg.getActualTypeArguments()[0]; // Integer Type valueType typeEggg.getActualTypeArguments()[1]; // UserModel}这虽是最基础的能力却足以替代项目中大量手写的泛型解析工具类。2. 泛型嵌套传导一键追到底实际业务里泛型常层层嵌套像 A - B extends A, Map - C extends B手工追踪简直是噩梦。EggG 能自动把泛型变量沿继承体系传导到底javaClassEggg classEggg eggg.getTypeEggg(C.class).getClassEggg();// 字段 x来自祖父类 A - 实际类型是 Listassert classEggg.getFieldEgggByName(x).getType() List.class;assert classEggg.getFieldEgggByName(x).getTypeEggg().getActualTypeArguments()[0] String.class;// 字段 y - 实际类型是 Mapassert classEggg.getFieldEgggByName(y).getType() Map.class;assert classEggg.getFieldEgggByName(y).getTypeEggg().getActualTypeArguments()[1] Integer.class;不管继承层级多深泛型参数的传导都由框架自动完成你只需关心「我想要什么」而非「它从哪里来」。3. 流式反射——告别丑陋的反射代码Java 原生反射的 API 设计反人类EggG 从 1.1.0 版本起提供流畅的链式反射调用让反射代码像普通调用一样自然javaEggg eggg new Eggg();// 从类开始创建实例 - 调用方法 - 获取结果String result eggg.reflect(String.class) .create(Hello World) .call(substring, 6) .get(); // World// 从实例开始直接调用String result2 eggg.reflect(Hello World) .call(substring, 6) .get();// 字段读写 链式操作Person person eggg.reflect(Person.class) .create() .setField(name, Tom) .setField(age, 25) .call(hello) .get();// 通过 getter/setter 访问属性Person p eggg.reflect(Person.class).create() .setProperty(name, Alice) // 走 setName .setProperty(age, 30) // 走 setAge .get();// 调用静态方法String s eggg.reflect(Person.class) .call(staticHello) .get();基本类型和包装类型间的自动互通也处理好了Integer 自动匹配 int 参数不用担心 NoSuchMethodException。4. 注解提炼与别名——框架作者的利器EggG 提供 DigestHandler提炼器和 AliasHandler别名器两个扩展点。框架作者在类型分析时能同步完成注解提取和别名映射一步构建出所需的元数据模型。以 JSON 序列化框架为例javaprivate static final Eggg eggg new Eggg() .withCreatorClass(ONodeCreator.class) // 指定构造器注解 .withDigestHandler(EgggUtil::doDigestHandle) // 注解提炼 .withAliasHandler(EgggUtil::doAliasHandle); // 别名映射一次类型分析中字段、方法、参数上的注解信息被同步提炼为 ONodeAttrHolder别名也自动映射比传统方式高效得多。设计亮点零依赖整个项目没有任何第三方依赖连测试用的 JUnit5 都是 test scope可用于任何 Java 项目不会引入传递依赖冲突。发布到 Maven Central开箱即用xml org.noear eggg 1.1.0全版本兼容从 JDK 8 到 JDK 25EggG 都支持。不管是坚守 Java 8 的老牌企业应用还是追着最新 LTS 版本的新锐项目都能放心用。智能缓存内部用 ConcurrentHashMap SoftReference 实现类型元数据的两级缓存。相同类型不重复分析内存紧张时自动释放在性能和资源间取得良好平衡。全局单例设计Eggg 实例设计为应用级全局单例使用一次配置、处处可用契合框架级组件使用场景。谁应该关注 EggG框架/中间件开发者若你在写序列化框架、依赖注入容器、ORM 框架或需深度分析 Java 类型元数据的工具EggG 能帮你省下数千行样板代码。SDK/工具库作者需要灵活的反射调用能力又不想向使用者暴露复杂的反射 API。追求优雅的工程师即便不是框架作者业务代码处理复杂泛型场景时EggG 也能让代码清晰可维护。在知名项目中的实战EggG 已在多个开源项目中作为核心依赖稳定运行[Solon](https://github.com/noear/solon)Java 轻量级应用框架用 EggG 完成依赖注入过程中的类型分析与元数据提取。[Snack4](https://github.com/noear/snack4)高性能 JSON 框架用 EggG 进行序列化/反序列化时的泛型推断与注解解析。经过这些项目的实战打磨EggG 在边界情况处理、性能表现和 API 稳定性上都达到了生产级水准。写在最后Java 的泛型编译后被擦除但「类型擦除」不意味着「信息消失」泛型的声明信息仍保留在 class 文件中等有心人发掘。EggG 就是帮你找回丢失泛型信息的工具它不大却精不喧哗但有用。如果你厌倦了在 Type 和 ParameterizedType 间反复横跳厌倦了手写脆弱的反射工具类不妨试试这枚「蛋」。