参考文档
这个写的挺全的,就是写的有点丑
这个写的不多,但是实用
用来测试的类
最终结果
注:方法有参数,才会有参数注解
//获取类池
ClassPool classPool = ClassPool.getDefault();
CtClass ctClass = null;
try {
//获取类
ctClass = classPool.getCtClass("aa.bb.cc.AAAA");
//获取方法
CtMethod method = ctClass.getDeclaredMethod("bbb");
ClassFile classFile = ctClass.getClassFile();
ConstPool constPool = classFile.getConstPool();
// 添加类注解
AnnotationsAttribute bodyAttr = new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag);
Annotation bodyAnnot = new Annotation(Controller.class.getName(), constPool);
bodyAttr.addAnnotation(bodyAnnot);
classFile.addAttribute(bodyAttr);
// 添加方法注解
AnnotationsAttribute methodAttr = new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag);
Annotation methodAnnot = new Annotation(GetMapping.class.getName(), constPool);
methodAttr.addAnnotation(methodAnnot);
method.getMethodInfo().addAttribute(methodAttr);
// 添加参数注解 注:参数注解,必须方法有参数才会生成
ParameterAnnotationsAttribute parameterAtrribute = new ParameterAnnotationsAttribute(constPool, ParameterAnnotationsAttribute.visibleTag);
Annotation paramAnnot = new Annotation(RequestBody.class.getName(), constPool);
Annotation[][] paramArrays = new Annotation[1][1];
paramArrays[0][0] = paramAnnot;
parameterAtrribute.setAnnotations(paramArrays);
method.getMethodInfo().addAttribute(parameterAtrribute);
/*
将修改后的CtClass加载至当前线程的上下文类加载器中,CtClass的toClass方法是通过调用本方法实现。需要注意的是一旦调用该方法,则无法继续修改已经被加载的class;
通过类加载器加载该CtClass。
*/
ctClass.toClass();
//根据CtClass生成 .class 文件
ctClass.writeFile("D:\\projectDemo\\swagger-aotu-demo\\silence-spring-auto\\src\\main\\java\\aa\\bb\\cc\\bb");
} catch (Exception e) {
e.printStackTrace();
}