# 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)

Ask DeepWiki Maven Apache 2 jdk-8 jdk-11 jdk-17 jdk-21 jdk-25
gitee star github star


##### 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(); } } ```