package com.mogujie.trade.tsharding.route.orm;
import javassist.CtMethod;
import javassist.bytecode.ConstPool;
import javassist.bytecode.ParameterAnnotationsAttribute;
import javassist.bytecode.annotation.Annotation;
import javassist.bytecode.annotation.MemberValue;
import javassist.bytecode.annotation.StringMemberValue;
import java.lang.reflect.Method;
/**
* @author qigong on 15/9/8 下午9:13.
*/
public class MapperAnnotationEnhancer {
public static ParameterAnnotationsAttribute duplicateParameterAnnotationsAttribute(ConstPool cp, Method method) {
ParameterAnnotationsAttribute oldAns = new ParameterAnnotationsAttribute(cp, ParameterAnnotationsAttribute.visibleTag);
javassist.bytecode.annotation.Annotation[][] anAr = new javassist.bytecode.annotation.Annotation[method.getParameterAnnotations().length][];
for (int i = 0; i < anAr.length; ++i) {
anAr[i] = new javassist.bytecode.annotation.Annotation[method.getParameterAnnotations()[i].length];
for (int j = 0; j < anAr[i].length; ++j) {
anAr[i][j] = createJavassistAnnotation(method.getParameterAnnotations()[i][j], cp);
}
}
oldAns.setAnnotations(anAr);
return oldAns;
}
public static javassist.bytecode.annotation.Annotation createJavassistAnnotation(java.lang.annotation.Annotation annotation, ConstPool cp) {
try {
javassist.bytecode.annotation.Annotation newAnnotation = new Annotation(annotation.annotationType().getName(), cp);
for (Method m : annotation.annotationType().getDeclaredMethods()) {
Object val = m.invoke(annotation);
newAnnotation.addMemberValue(m.getName(), createMemberValue(m.getReturnType(), val, cp));
}
return newAnnotation;
} catch (Exception e) {
throw new RuntimeException("createJavassistAnnotation error!", e);
}
}
private static MemberValue createMemberValue(Class<?> type, Object val, ConstPool cp) {
if (type == String.class) {
return new StringMemberValue((String) val, cp);
} else {
throw new RuntimeException("Only support string param value! Invalid param value type:" + type + " and value: " + val);
}
}
}