一、内容概述

今天讲一下Java中的一个非常强大的基础特性——注解。Java中的注解是从1.5时开始提供的,其元注解有四个分别是@Target,@Retention,@Documented,@Inherited。今天的实战例子中讲解前两,这两个是使用频率最高的两个。注解在一般的开发中不容易碰到,即使碰到了也是直接用别人的的框架,但是了解基础的注解对自己写框架或者读懂别人写的框架都是非常有帮助的,当前流行的Android框架中有非常多都用到了注解。如:ARouter、EventBus、RxJava2、Retrofit2、Glide等都或多或少的用到了注解。下面直接看下实战部分,注解的详细注释都写在注释中的,大家直接看代码吧。




java 类 获取注解值 java获取注解的值_方法参数


二、实战代码

/** * Java提供了四种元注解: * 1.Target:表明注解可以用在什么地方,即可以修饰那些元素     * ElementType.ANNOTATION_TYPE用于其他注解的元注解     * ElementType.CONSTRUCTOR 用于构造函数     * ElementType.FIELD 用于全局变量     * ElementType.METHOD 用于方法     * ElementType.Type(用于类、接口、注解、枚举)     * ElementType.PARAMETER用于方法参数     * ElementType.LOCAL_VARIABLE用于本地变量 * 2.Retention:表明注解在什么地方可用     * RetentionPolicy.SOURCE(在源码中保留、编译器舍弃)     * RetentionPolicy.CLASS(保留到编译器,程序运行期舍弃)     * RetentionPolicy.RUNTIME (保留到程序运行期)编辑器把注解记录在class文件中,在运行期间程序可通过反射获取注解 * 3.Documented:执行doc命令时,该元注解修饰的自定义注解也会生成在文档中 * 4.Inherited:如果父类所使用的注解有@Inherited,则子类可以继承该注解,否则不可以继承 *
* 案例:在运行期通过注解获取类、方法、属性、方法参数上的注解 * Created by yangwei on 2020/8/5. */@AnnotationTest.IClass(className = "AnnotationTest")public class AnnotationTest { /** * 用于类的注解 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @interface IClass { String className(); } /** * 用于属性的注解 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @interface IField { String fieldName(); } /** * 用于方法的注解 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @interface IMethod { String methodName(); } /** * 用于参数的注解 */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @interface IParameter { String parameterName(); } /** * 给属性增加注解 */ @IField(fieldName = "fieldName") private String name; /** * 给方法加上注解 * * @param name 给参数加上注解 */ @IMethod(methodName = "methodName") public void setName(@IParameter(parameterName = "parameterName") String name) { this.name = name; } public String getName() { return name; } /** * 程序的入口main方法,用于测试自定义的注解 * * @param args */ public static void main(String[] args) { AnnotationTest test = new AnnotationTest(); test.setName("杨洛峋"); System.out.println(test.getName()); //获取Class对象 Class clazz = test.getClass(); //得到类级别的注解集合 Annotation[] annotations = clazz.getAnnotationsByType(IClass.class); for (Annotation a : annotations) { //输出注解的值 String value = ((IClass) a).className(); System.out.println("类注解的注解值:"+value); } //得到field属性 Field[] fields = clazz.getDeclaredFields(); for (Field f : fields) { Annotation[] fs = f.getDeclaredAnnotations(); for (Annotation a : fs) { System.out.println("属性注解的值:"+((IField) a).fieldName()); } } //得到方法属性 Method[] methods = clazz.getDeclaredMethods(); for (Method m : methods) { //输出方法注解 Annotation[] ms = m.getDeclaredAnnotations(); for (Annotation a : ms) { System.out.println("方法的注解值:"+((IMethod) a).methodName()); } //得到方法的参数注解 Annotation[][] pps = m.getParameterAnnotations(); for (Annotation[] pp : pps) { for (Annotation p : pp) { System.out.println("方法参数的注解值:"+((IParameter) p).parameterName()); } } } }}


输出内容:杨洛峋类注解的注解值:AnnotationTest属性注解的值:fieldName方法的注解值:methodName方法参数的注解值:parameterName


java 类 获取注解值 java获取注解的值_元注解_02


三、结束语

了解了元注解以及自定义注解是怎么回事后,再回过头来看框架的相关内容会非常的容易,基本上一看到某个注解,你就知道他到底是干嘛的。为了加深印象,大家不妨动手验证一下。


java 类 获取注解值 java获取注解的值_java 类 获取注解值_03