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));
}
}