带刺的坐椅 如果你写过框架级代码一定体会过这种绝望——为了搞清楚一个ListMapString, User里到底藏了什么类型你在Type、ParameterizedType、TypeVariable的迷宫里绕了两个小时最后写出一堆自己第二天都看不懂的反射代码。一枚「蛋」的诞生EggG 是一个 Java 类型元数据分析与构建工具同时也是流式反射调用框架。它的名字带着几分趣味——Egg 译为「蛋」寓意「孵化」出类型信息中隐藏的一切细节。这个项目由 Solon 框架作者 noear 发起目前已在 Solon、Snack4 等知名框架中作为核心基础设施使用。它用大约3600 行精炼代码把 Java 泛型反射这件事做到了优雅而完整。它能做什么1. 一行代码看透泛型不再需要手动拆解ParameterizedType。EggG 替你完成从类型声明到实际泛型参数的全链路分析Eggg 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. 泛型嵌套传导一键追到底真实业务中泛型往往层层嵌套。AX, Y→BM, N extends AListM, MapString, N→C extends BString, Integer——面对这样的继承链手工追踪简直是噩梦。EggG 可以自动把泛型变量沿着继承体系一路传导到底ClassEggg classEggg eggg.getTypeEggg(C.class).getClassEggg(); // 字段 x来自祖父类 A→ 实际类型是 ListString assert classEggg.getFieldEgggByName(x).getType() List.class; assert classEggg.getFieldEgggByName(x).getTypeEggg().getActualTypeArguments()[0] String.class; // 字段 y → 实际类型是 MapString, Integer assert classEggg.getFieldEgggByName(y).getType() Map.class; assert classEggg.getFieldEgggByName(y).getTypeEggg().getActualTypeArguments()[1] Integer.class;无论继承层级有多深泛型参数的传导都由框架自动完成。你只需要关心「我想要什么」而不是「它从哪里来」。3. 流式反射——告别丑陋的反射代码Java 原生反射的 API 设计堪称反人类。EggG 从 1.1.0 版本起提供了流畅的链式反射调用让反射代码变得像普通调用一样自然Eggg 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 序列化框架为例private static final Eggg eggg new Eggg() .withCreatorClass(ONodeCreator.class) // 指定构造器注解 .withDigestHandler(EgggUtil::doDigestHandle) // 注解提炼 .withAliasHandler(EgggUtil::doAliasHandle); // 别名映射在一次类型分析过程中字段、方法、参数上的注解信息被同步提炼为ONodeAttrHolder别名也被自动映射。这比「先反射拿类型、再反射拿注解、最后手动拼装」的传统方式高效得多。设计亮点零依赖整个项目没有任何第三方依赖连测试用的 JUnit5 都是 test scope。这意味着你可以把它用在任何 Java 项目中不会引入任何传递依赖冲突。发布到 Maven Central开箱即用dependency groupIdorg.noear/groupId artifactIdeggg/artifactId version1.1.0/version /dependency全版本兼容从 JDK 8 到 JDK 25EggG 全部支持。无论你的项目是坚守 Java 8 的老牌企业应用还是追着最新 LTS 版本跑的新锐项目都可以放心使用。智能缓存内部使用ConcurrentHashMapSoftReference实现了类型元数据的两级缓存。相同类型不会重复分析内存紧张时又可以自动释放在性能和资源之间取得了良好的平衡。全局单例设计Eggg实例被设计为应用级全局单例使用。一次配置、处处可用非常契合框架级组件的使用场景。谁应该关注 EggG框架/中间件开发者—— 如果你正在写序列化框架、依赖注入容器、ORM 框架或者任何需要深度分析 Java 类型元数据的工具EggG 可以帮你省下数千行样板代码。SDK/工具库作者—— 需要灵活的反射调用能力又不想暴露复杂的反射 API 给使用者。追求优雅的工程师—— 即使不是框架作者当你的业务代码需要处理复杂泛型场景时EggG 也能让代码变得清晰可维护。在知名项目中的实战