Solon v3.10.7

快速上手

</> markdown
2026年5月29日 上午9:07:02

EggG 是一个轻量的类型分析与反射增强库,用流式 API 简化泛型解析和反射操作。本文将引导你在 5 分钟内完成基本配置并运行第一个示例。

1、环境要求

要求版本
JDK8 及以上(兼容 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();