再次认识java注解
一、什么是注解
Java注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
什么是元数据
元数据是一个非常广泛的概念,元数据的定义也非常简单,只要是描述数据的数据都是元数据。很简单,一个数字170,单看数据你肯定不知道这个数据代表什么,这就需要元数据支持,你才能明白数据代表的事实是什么。它可能是一个人的身高,也可能指一个人的体重,这需要数据对应的标题、单位等信息来描述这个数据,这些就是描述这个数据的元数据了。
简单来理解就是对数据进行修饰或解释的数据就叫元数据。
注解分类
内置注解:Java提供了一些内置的注解,像@Override用于检查方法是否正确重写,@Deprecated用于标记某个方法或类已经废弃,@SuppressWarnings则可以抑制编译器产生的警告信息。
元注解:元注解是用于定义其他注解的注解,常见的有@Target、@Retention等。
自定义注解:开发时可以根据具体的业务需求来定义自己的注解。
第三方框架定义的注解:比如springboot矿机中就自带了很多的注解(@Controller @Autowired @Bean 等等)。
二、什么是元注解
元注解是用来约束自定义注解的使用范围和生命周期的注解。常用的元注解有@Target和@Retention。
通俗的来说 元注解就是修饰注解的注解 还有一个词叫元数据 就是修饰数据的数据 类似的还有 元宇宙。
@Target
用于指定注解的使用位置,可选的参数值在ElementType枚举类中定义:
- TYPE:用在类、接口上
- FIELD:用在成员变量上
- METHOD:用在方法上
- PARAMETER:用在参数上
- CONSTRUCTOR:用在构造方法上
- LOCAL_VARIABLE:用在局部变量上
例如:
@Target({ElementType.METHOD, ElementType.TYPE}) public @interface MyAnnotation { }
@Retention
用于指定注解的生命周期,可选的参数值在RetentionPolicy枚举类中定义:
- SOURCE:注解只存在于源代码中,编译后的字节码文件中不存在
- CLASS:注解存在于源代码和字节码文件中,运行时内存中不存在(默认值)
- RUNTIME:注解存在于源代码、字节码文件和运行时内存中,可以通过反射获取
例如:
@Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { }
@Documented
注解用于标记一个注解是否应该包含在Javadoc中。
三、自定义注解
自定义注解语法
自定义注解使用@interface关键字来定义,例如:
public @interface Loggable { String module() default "log"; // 属性可设默认值 boolean enable() default true; }
属性类型限制
注解的属性类型有一定的限制,仅支持基本类型、String、Class、枚举、其他注解以及它们的数组。
默认值
可以通过default关键字为注解的属性指定默认值。如果一个属性没有默认值,那么在使用该注解时必须为其赋值。
四、注解的解析
注解就像一个标签,是贴在程序代码上供另一个程序读取的。只要用到注解,必然有三角关系:定义注解,使用注解,读取注解。

首先定义一个注解
package anno; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) // 使用元注解修饰改注解为作用在方法上面 @Retention(RetentionPolicy.RUNTIME) // 使用元注解修饰改注解为运行是注解 public @interface MethodTag { String methodTag() default "global method"; }
使用注解
package anno; public class People { private String name; @MethodTag(methodTag = "public method") public String getName(){ return this.name; } }
第三方程序处理注解
package anno; import java.lang.reflect.Method; public class ProcessPeople { public static void main(String[] args) throws NoSuchMethodException { Class<People> peopleClass = People.class; Method getName = peopleClass.getMethod("getName"); MethodTag methodTag = getName.getAnnotation(MethodTag.class); String tag = methodTag.methodTag(); System.out.println(tag); if(tag.equals("public")){ System.out.println("这是一个公开方法"); } } }
运行结果

总结
注解就像标签,是程序判断执行的依据。比如,程序读到@Test就知道这个方法是待测试方法,而@Before的方法要在测试方法之前执行
注解需要三要素:定义、使用、读取并执行
注解分为自定义注解、JDK内置注解和第三方注解(框架)。自定义注解一般要我们自己定义、使用、并写程序读取,而JDK内置注解和第三方注解我们只要使用,定义和读取都交给它们
大多数情况下,三角关系中我们只负责使用注解,无需定义和执行,框架会将注解类和读取注解的程序隐藏起来,除非阅读源码,否则根本看不到。平时见不到定义和读取的过程,光顾着使用注解,久而久之很多人就忘了注解如何起作用了!
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号