# 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
A Java type metadata analysis and building tool (generics, annotations, distill, aliasing, caching)
##### Language: English | [中文](README_CN.md)
### About EggG
A tool for analyzing and building Java type metadata. It covers details of types, classes, constructors, methods, fields, properties, parameters, generic propagation, and more. Suitable for: framework projects involving generics and annotations.
### Example 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;
}
}
```
### Example 2 (Nested Transmission)
```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 {
}
}
```
### Example 3 (for snack4)
This example needs to generate refinements, aliases, and specify constructors based on the annotation. Custom content needs to be added.
```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();
}
}
}
```
### Example 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();
}
}
```