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

### 1、环境要求

| 要求 | 版本 |
|---|---|
| JDK | 8 及以上（兼容 8 / 11 / 17 / 21 / 25） |
| 构建工具 | Maven 或 Gradle |

### 2、引入依赖


```xml
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>eggg</artifactId>
    <version>1.1.2</version>
</dependency>
```


### 3、创建 Eggg 实例

`Eggg` 实例是线程安全的，推荐在整个应用中共享一个实例：

```java
import org.noear.eggg.Eggg;

private static final Eggg eggg = new Eggg();
```

如果需要自定义注解解析或反射拦截，可以在构建时注册 Handler：

```java
// 注册自定义 Handler
private static final Eggg eggg = new Eggg()
    .withDigestHandler(MyApp::doDigestHandle)
    .withAliasHandler(MyApp::doAliasHandle);
```

### 4、示例一：流式反射调用

以下代码通过反射创建一个 `String` 对象并调用其 `substring` 方法：

```java
// 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 会自动解析这些信息。

```java
// 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 方法访问。

```java
// 字段直接读写（绕过 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 自动处理这种转换：

```java
// 构造器参数声明为 int，传入 Integer 也能自动匹配
Person p = eggg.reflect(Person.class)
    .create("Bob", 30)
    .get();
```


