项目结构
代码位置:https://github.com/ssslinppp/reflectdemo自定义注解
ClassAnnotation.java
@Documented@Target({ElementType.TYPE})@Retention(RUNTIME)public @interface ClassAnnotation { String classAlias() default "";}
MethodAnnotation
@Documented@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface MethodAnnotation { String methodAlias() default "";}
ParamAnnotation
@Documented@Target({ElementType.PARAMETER})@Retention(RUNTIME)public @interface ParamAnnotation { String alias() default "";}
接口实现自定义注解
IDemoOne
@ClassAnnotation(classAlias = "DemoInterfaceOne")public interface IDemoOne { @MethodAnnotation(methodAlias = "methodOne") public String getOne(@ParamAnnotation(alias = "keyAlias") String key); @MethodAnnotation(methodAlias = "methodMulti") public String getMulti(@ParamAnnotation(alias = "nameAlias") String name, @ParamAnnotation(alias = "ageAlias") int age);}
IDemoTwo
@ClassAnnotation(classAlias = "DemoInterfaceTwo")public interface IDemoTwo { @MethodAnnotation(methodAlias = "methodPostOne") public String postOne(@ParamAnnotation(alias = "mapAlias") HashMap map);}
通过反射获取接口和注解信息
获取接口信息-ClassAnnotation注解信息
/** * 获取带有 ClassAnnotation 声明的所有接口和类,并获取 ClassAnnotation 声明中的原数据 */ public void getTypesAnnotatedWith() { // 获取带有 ClassAnnotation 声明的所有接口和类 Set> requests = new Reflections("com.ssslinppp.*").getTypesAnnotatedWith(ClassAnnotation.class); for (Class cls : requests) { System.out.println("- 接口或类全名:" + cls.getName()); for (Annotation annotation : cls.getAnnotations()) { System.out.println("-- 所有的接口信息 :" + annotation.annotationType()); } System.out.println("-- 获取ClassAnnotation声明的classAlias:" + cls.getAnnotation(ClassAnnotation.class).classAlias()); System.out.println(); } }
输出:
########## 获取所有 ClassAnnotation 声明的类和接口 start ####### - 接口或类全名:com.ssslinppp.reflectdemo.interfaces.IDemoOne-- 所有的接口信息 :interface com.ssslinppp.reflectdemo.annotations.ClassAnnotation-- 获取ClassAnnotation声明的classAlias:DemoInterfaceOne- 接口或类全名:com.ssslinppp.reflectdemo.interfaces.IDemoTwo-- 所有的接口信息 :interface com.ssslinppp.reflectdemo.annotations.ClassAnnotation-- 获取ClassAnnotation声明的classAlias:DemoInterfaceTwo###### 获取所有 ClassAnnotation 声明的类和接口 end ######
获取方法信息-MethodAnnotation注解信息-ParamAnnotation注解信息
public void getMethodInfo() { // 获取带有 ClassAnnotation 声明的所有接口和类 Set> requests = new Reflections("com.ssslinppp.*").getTypesAnnotatedWith(ClassAnnotation.class); for (Class cls : requests) { System.out.println("类或接口名:" + cls.getSimpleName()); for (Method method : cls.getMethods()) { System.out.println(" 方法名:" + method.getName() + ", 返回值类型:" + method.getReturnType()); // 获取方法Annotation MethodAnnotation methodAnnotation = method.getAnnotation(MethodAnnotation.class); System.out.println(" 方法Annotation原数据,methodAlias:" + methodAnnotation.methodAlias()); // 获取参数 for (Parameter parameter : method.getParameters()) { System.out.println(" 参数别名:" + parameter.getAnnotation(ParamAnnotation.class).alias()); } System.out.println(); } } }
输出:
@@@@ 获取 方法信息 start @@@@ 类或接口名:IDemoOne 方法名:getOne, 返回值类型:class java.lang.String 方法Annotation原数据,methodAlias:methodOne 参数别名:keyAlias 方法名:getMulti, 返回值类型:class java.lang.String 方法Annotation原数据,methodAlias:methodMulti 参数别名:nameAlias 参数别名:ageAlias类或接口名:IDemoTwo 方法名:postOne, 返回值类型:class java.lang.String 方法Annotation原数据,methodAlias:methodPostOne 参数别名:mapAlias@@@@ 获取 方法信息 end @@@@
完整测试代码
引用反射工具类
org.reflections reflections 0.9.10
ReflectDemo
package com.ssslinppp.reflectdemo.reflect;import com.ssslinppp.reflectdemo.annotations.ClassAnnotation;import com.ssslinppp.reflectdemo.annotations.MethodAnnotation;import com.ssslinppp.reflectdemo.annotations.ParamAnnotation;import org.reflections.Reflections;import org.springframework.boot.CommandLineRunner;import org.springframework.stereotype.Component;import java.lang.annotation.Annotation;import java.lang.reflect.Method;import java.lang.reflect.Parameter;import java.util.Set;@Componentpublic class ReflectDemo implements CommandLineRunner { /** * 获取带有 ClassAnnotation 声明的所有接口和类,并获取 ClassAnnotation 声明中的原数据 */ public void getTypesAnnotatedWith() { // 获取带有 ClassAnnotation 声明的所有接口和类 Set> requests = new Reflections("com.ssslinppp.*").getTypesAnnotatedWith(ClassAnnotation.class); for (Class cls : requests) { System.out.println("接口或类全名:" + cls.getName()); for (Annotation annotation : cls.getAnnotations()) { System.out.println(" 所有的接口信息 :" + annotation.annotationType()); } System.out.println(" 获取ClassAnnotation声明的classAlias:" + cls.getAnnotation(ClassAnnotation.class).classAlias()); System.out.println(); } } public void getMethodInfo() { // 获取带有 ClassAnnotation 声明的所有接口和类 Set > requests = new Reflections("com.ssslinppp.*").getTypesAnnotatedWith(ClassAnnotation.class); for (Class cls : requests) { System.out.println("类或接口名:" + cls.getSimpleName()); for (Method method : cls.getMethods()) { System.out.println(" 方法名:" + method.getName() + ", 返回值类型:" + method.getReturnType()); // 获取方法Annotation MethodAnnotation methodAnnotation = method.getAnnotation(MethodAnnotation.class); System.out.println(" 方法Annotation原数据,methodAlias:" + methodAnnotation.methodAlias()); // 获取参数 for (Parameter parameter : method.getParameters()) { System.out.println(" 参数别名:" + parameter.getAnnotation(ParamAnnotation.class).alias()); } System.out.println(); } } } @Override public void run(String... strings) throws Exception { System.out.println("@@@@ 获取所有 ClassAnnotation 声明的类和接口 start @@@@ "); getTypesAnnotatedWith(); System.out.println("@@@@ 获取所有 ClassAnnotation 声明的类和接口 end @@@@ "); System.out.println(); System.out.println("@@@@ 获取 方法信息 start @@@@ "); getMethodInfo(); System.out.println("@@@@ 获取 方法信息 end @@@@ "); }}