快速上手
2026年5月29日 上午9:07:02
EggG 是一个轻量的类型分析与反射增强库,用流式 API 简化泛型解析和反射操作。本文将引导你在 5 分钟内完成基本配置并运行第一个示例。
1、环境要求
| 要求 | 版本 |
|---|---|
| JDK | 8 及以上(兼容 8 / 11 / 17 / 21 / 25) |
| 构建工具 | Maven 或 Gradle |
2、引入依赖
<dependency>
<groupId>org.noear</groupId>
<artifactId>eggg</artifactId>
<version>1.1.2</version>
</dependency>
3、创建 Eggg 实例
Eggg 实例是线程安全的,推荐在整个应用中共享一个实例:
import org.noear.eggg.Eggg;
private static final Eggg eggg = new Eggg();
如果需要自定义注解解析或反射拦截,可以在构建时注册 Handler:
// 注册自定义 Handler
private static final Eggg eggg = new Eggg()
.withDigestHandler(MyApp::doDigestHandle)
.withAliasHandler(MyApp::doAliasHandle);
4、示例一:流式反射调用
以下代码通过反射创建一个 String 对象并调用其 substring 方法:
// reflect(String.class) → 指定要操作的类
// .create("Hello World") → 调用构造器
// .call("substring", 6) → 调用 substring(6)
// .get() → 获取结果
String result = eggg.reflect(String.class)
.create("Hello World")
.call("substring", 6)
.get();
System.out.println(result); // 输出: World
作为对比,同样的操作使用 Java 原生反射需要处理多种受检异常。当类名和方法名来自配置文件或运行时变量时,EggG 的流式 API 能显著减少代码量。
5、示例二:类型元数据分析
Java 的泛型在编译后会被擦除,运行时无法直接获取 List<String> 中的 String。通过创建匿名子类(new HashMap<String, Integer>() {},注意末尾的 {}),可以让编译器在子类的父类签名中保留泛型参数信息,EggG 会自动解析这些信息。
// new HashMap<String, Integer>() {} — 匿名子类,编译器会保留泛型参数
TypeEggg typeEggg = eggg.getTypeEggg(new HashMap<String, Integer>() {}.getClass());
System.out.println(typeEggg.isMap()); // true
System.out.println(typeEggg.isParameterizedType()); // true
// 获取泛型参数的实际类型
Type[] args = typeEggg.getActualTypeArguments();
System.out.println(args[0]); // class java.lang.String
System.out.println(args[1]); // class java.lang.Integer
提示:
new Xxx<A, B>() {}中的空大括号创建了一个匿名子类,编译器会将其父类的泛型参数保留在字节码中。
6、示例三:字段与属性操作
EggG 支持对象的字段(Field)和属性(Property)读写。字段是直接操作变量本身,属性是通过 getter/setter 方法访问。
// 字段直接读写(绕过 getter/setter)
Person person = eggg.reflect(Person.class)
.create()
.setField("name", "Tom")
.setField("age", 25)
.get();
String name = eggg.reflect(person).field("name").get(); // "Tom"
// 属性读写(通过 getter/setter)
Person p = eggg.reflect(Person.class).create()
.setProperty("name", "Alice") // 调用 setName("Alice")
.setProperty("age", 30) // 调用 setAge(30)
.get();
String pName = eggg.reflect(p).property("name").get(); // 调用 getName() → "Alice"
7、基本类型自动互通
Java 的基本类型(int)与包装类型(Integer)在反射调用中常常引发类型不匹配问题。EggG 自动处理这种转换:
// 构造器参数声明为 int,传入 Integer 也能自动匹配
Person p = eggg.reflect(Person.class)
.create("Bob", 30)
.get();