# eggg
**Repository Path**: noear/eggg
## Basic Information
- **Project Name**: eggg
- **Description**: 一个 Java 类型元数据分析与构建工具(泛型、注解、提炼、别名、缓存)
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 9
- **Forks**: 1
- **Created**: 2025-10-21
- **Last Updated**: 2025-12-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Java, generic, tool
## README
EggG
一个 Java 类型元数据分析与构建工具(泛型、注解、提炼、别名、缓存)
##### 语言: 中文 | [English](README.md)
### 关于 EggG
一个 Java 类型元数据分析与构建工具。分析会涉及:类型、类、构造器、方法、字段、属性、参数,泛型传导等细节。适合一些:涉及泛型和注解的框架性项目采用。
### 示例1
```java
public class EgggDemo {
//一般,应用内全局单例
private static Eggg eggg = new Eggg();
@Test
public void case1() {
TypeEggg typeEggg = eggg.getTypeEggg(new HashMap() {}.getClass());
if (typeEggg.isMap()) {
if (typeEggg.isParameterizedType()) {
//已经分析过的
Type keyType = typeEggg.getActualTypeArguments()[0];
Type ValueType = typeEggg.getActualTypeArguments()[1];
assert keyType.equals(Integer.class);
assert ValueType.equals(UserModel.class);
return;
}
}
assert false;
}
}
```
### 示例2(嵌套传递)
```java
public class EgggDemo {
//一般,应用内全局单例
private static Eggg eggg = new Eggg();
@Test
public void case2() {
ClassEggg classEggg = eggg.getTypeEggg(C.class).getClassEggg();
for(FieldEggg fe : classEggg.getAllFieldEgggs()) {
fe.getDigest();
}
assert classEggg.getFieldEgggByName("x").getType() == List.class;
assert classEggg.getFieldEgggByName("x").getTypeEggg().isParameterizedType();
assert classEggg.getFieldEgggByName("x").getTypeEggg().getActualTypeArguments()[0] == String.class;
assert classEggg.getFieldEgggByName("y").getType() == Map.class;
assert classEggg.getFieldEgggByName("y").getTypeEggg().isParameterizedType();
assert classEggg.getFieldEgggByName("y").getTypeEggg().getActualTypeArguments()[0] == String.class;
assert classEggg.getFieldEgggByName("y").getTypeEggg().getActualTypeArguments()[1] == Integer.class;
assert classEggg.getFieldEgggByName("m").getType() == String.class;
assert classEggg.getFieldEgggByName("n").getType() == Integer.class;
}
public static class A {
public X x;
public Y y;
}
public static class B extends A, Map> {
public M m;
public N n;
}
public static class C extends B {
}
}
```
### 示例3 (for snack4)
这个示例需要根据 "注解" 生成提炼物、别名,以及指定构造器。需要添加定制内容。
```java
package org.noear.snack4.codec.util;
import org.noear.eggg.*;
import org.noear.snack4.annotation.ONodeAttrHolder;
import org.noear.snack4.annotation.ONodeAttr;
import org.noear.snack4.annotation.ONodeCreator;
import java.lang.reflect.*;
public class EgggUtil {
private static final Eggg eggg = new Eggg()
.withCreatorClass(ONodeCreator.class)
.withDigestHandler(EgggUtil::doDigestHandle)
.withAliasHandler(EgggUtil::doAliasHandle);
private static String doAliasHandle(ClassEggg cw, AnnotatedEggg s, String ref) {
if (s.getDigest() instanceof ONodeAttrHolder) {
return ((ONodeAttrHolder) s.getDigest()).getAlias();
} else {
return ref;
}
}
private static Object doDigestHandle(ClassEggg cw, AnnotatedEggg s, Object ref) {
ONodeAttr attr = s.getElement().getAnnotation(ONodeAttr.class);
if (attr == null && ref != null) {
return ref;
}
if (s instanceof FieldEggg) {
return new ONodeAttrHolder(attr, ((Field) s.getElement()).getName());
} else if (s instanceof PropertyMethodEggg) {
return new ONodeAttrHolder(attr, Property.resolvePropertyName(((Method) s.getElement()).getName()));
} else if (s instanceof ParamEggg) {
return new ONodeAttrHolder(attr, ((Parameter) s.getElement()).getName());
} else {
return null;
}
}
public static TypeEggg getTypeEggg(Type type) {
return eggg.getTypeEggg(type);
}
}
```
```java
public class Demo {
public void case1(){
ypeEggg typeEggg = EgggUtil.getTypeEggg(clazz);
for (FieldEggg fw : typeEggg.getClassEggg().getFieldEgggs()) {
if (fw.isStatic()) {
continue;
}
//已经分析过的泛型
fw.getTypeEggg();
}
}
}
```
### 示例4(for Solon)
```java
package org.noear.solon.core.util;
import org.noear.eggg.*;
import org.noear.solon.core.wrap.FieldSpec;
import org.noear.solon.core.wrap.ParamSpec;
import org.noear.solon.core.wrap.VarSpec;
import java.lang.reflect.*;
public class EgggUtil {
private static final Eggg eggg = new Eggg()
.withAliasHandler(EgggUtil::doAliasHandle)
.withDigestHandler(EgggUtil::doDigestHandle)
.withReflectHandler(new EgggReflectHandler());
private static String doAliasHandle(ClassEggg cw, AnnotatedEggg s, String ref) {
if (s.getDigest() instanceof VarSpec) {
return s.getDigest().getName();
}
return ref;
}
private static Object doDigestHandle(ClassEggg cw, AnnotatedEggg s, Object ref) {
if (s instanceof FieldEggg) {
return new FieldSpec((FieldEggg) s);
} else if (s instanceof ParamEggg) {
return new ParamSpec((ParamEggg) s);
}
return ref;
}
public static TypeEggg getTypeEggg(Type type) {
return eggg.getTypeEggg(type);
}
public static ClassEggg getClassEggg(Type type) {
return getTypeEggg(type).getClassEggg();
}
}
```