文章目录
- 前言
- 一、代码部分
- 总结
前言
注解在后端开发过程中提供了许多的便利,提高了代码简洁性和可读性,在应用程序中占据越来越重要的作用,很有学习的必要,接下来会通过代码来完成对类、方法、属性注解的解析。
一、代码部分
package test;import com.student.SpringbootStart;
import com.student.controller.StudentCurriculumController;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;/*** Create by zjg on 2023/7/16*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootStart.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class AnnotationTest {@Autowiredprivate ConfigurableApplicationContext applicationContext;@Autowiredprivate StudentCurriculumController studentCurriculumController;@Testpublic void main() throws NoSuchMethodException {//模拟RequestMapping路径的拼接//todo classMap<String, Object> annotations = applicationContext.getBeansWithAnnotation(RequestMapping.class);annotations.forEach((k,v)->{System.out.println(String.format("服务{%s}可访问服务列表如下:",k));RequestMapping requestMapping = applicationContext.findAnnotationOnBean(k, RequestMapping.class);String prefix="";if(requestMapping!=null){prefix=requestMapping.value()[0];}//todo methodMethod[] methods;if(v.getClass().getName().contains("$$")){//处理代理类methods= v.getClass().getSuperclass().getDeclaredMethods();}else{methods = v.getClass().getDeclaredMethods();}for(Method method:methods){RequestMapping requestMapping1 = method.getAnnotation(RequestMapping.class);String suffix="";;if(requestMapping1!=null){suffix=requestMapping1.value().length==0?"":requestMapping1.value()[0];}PostMapping postMapping = method.getAnnotation(PostMapping.class);if(postMapping!=null){suffix=postMapping.value()[0];}GetMapping getMapping = method.getAnnotation(GetMapping.class);if(getMapping!=null){suffix=getMapping.value()[0];}if(!(prefix.endsWith("/"))&&!(suffix.startsWith("/"))){//此处是因为编码不规范,emosuffix="/"+suffix;}System.out.println(prefix+suffix);}//todo fieldField[] declaredFields;if(v.getClass().getName().contains("$$")){//处理代理类declaredFields= v.getClass().getSuperclass().getDeclaredFields();}else{declaredFields= v.getClass().getDeclaredFields();}for (Field declaredField : declaredFields) {Autowired autowired = declaredField.getAnnotation(Autowired.class);if(autowired!=null){boolean required = autowired.required();System.out.println(declaredField.getName()+".required="+required);}}});}
}
总结
回到顶部
代理类会使我们获取注解失败,要做特殊处理。