动态给class加注解


package vine.common; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; import javassist.ClassPool; import javassist.CtClass; import javassist.CtField; import javassist.bytecode.AnnotationsAttribute; import javassist.bytecode.AttributeInfo; import javassist.bytecode.annotation.Annotation; import javassist.bytecode.annotation.IntegerMemberValue; import lombok.SneakyThrows; import java.lang.reflect.Field; import java.util.List; public class AssistUtil { @SneakyThrows public static Class<?> addAnnotation(String clzName,String annotationName) { ClassPool classPool = ClassPool.getDefault(); CtClass clz = classPool.get(clzName); CtField[] fields = clz.getDeclaredFields(); int i = 0; for (CtField field : fields) { List<AttributeInfo> attributes = field.getFieldInfo().getAttributes(); AnnotationsAttribute annotationsAttribute; if (!attributes.isEmpty()) { annotationsAttribute = (AnnotationsAttribute) attributes.get(0); }else { annotationsAttribute = new AnnotationsAttribute(field.getFieldInfo().getConstPool(), AnnotationsAttribute.visibleTag); } Annotation annotation = new Annotation(annotationName, field.getFieldInfo().getConstPool()); annotation.addMemberValue("ordinal",new IntegerMemberValue(field.getFieldInfo().getConstPool(),i++)); // annotation.addMemberValue("ordinal",new IntegerMemberValue(i++,field.getFieldInfo().getConstPool())); annotationsAttribute.addAnnotation(annotation); field.getFieldInfo().addAttribute(annotationsAttribute); } Class<?> afterClass = clz.toClass(); for (Field field : afterClass.getDeclaredFields()) { for (java.lang.annotation.Annotation annotation : field.getAnnotations()) { System.out.println(annotation); } } return afterClass; } @SneakyThrows public static String toJsonString(Class<?> type) { SerializerFeature[] serializer = {SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteNullBooleanAsFalse}; Object o = type.newInstance(); return JSONObject.toJSONString(o,serializer); } public static void main(String[] args) { Class<?> aClass = addAnnotation("vine.base.Prepare", "com.alibaba.fastjson.annotation.JSONField"); System.out.println(toJsonString(aClass)); } }

  

原文地址:https://www.cnblogs.com/albertXe/p/14523539.html