1、什么是注解
类似一种特殊的注释,可以在程序运行时被反射获取,如同标签。
2、注解分类
- 内置注解
- 自定义注解
内置注解
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
-
作用在代码的注解:
@Override
- 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated
- 标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings
- 指示编译器去忽略注解中声明的警告。 -
作用在其他注解的注解(或者说元注解):
@Retention
- 保留期,标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
@Documented
- 作用是能够将注解中的元素包含到 Javadoc 中去。
@Target
- 标记这个注解运用的地方。
@Inherited
- 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类) -
从 Java 7 开始,额外添加了 3 个注解:
@SafeVarargs
- Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
@FunctionalInterface
- Java 8 开始支持,标识一个匿名函数或函数式接口。
@Repeatable
- Java 8 开始支持,标识某注解可以在同一个声明上使用多次。
自定义注解
先知道一个点,注解的属性也叫做成员变量。注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。
@Target(ElementType.METHOD) // 表示注释到方法上
@Retention(RetentionPolicy.RUNTIME) // 保留到程序运行的时候
public @interface Info {
public int id();
public String desc() default "暂无";
}
// 一开始看到注解总是有点懵,感觉像是一般类的成员变量和方法的总和,但查的时候上面说注解里只有成员变量(属性)
class Demo {
//类属性,(成员属性不会加访问权限修饰符)
private int id;
private String name;
public void show(){}
public void add(){}
}
注解提取
// 被注解的类
public class Demo01 {
private int id;
private String name;
@Info(id=101)
public void show(){
}
@Info(id=102,desc = "这是一个显示信息方法...")
public void display(){
}
public void add(){}
}
import java.lang.reflect.Method;
// 解析类
public class InfoTracker {
public static void main(String[] args) {
InfoTracker it = new InfoTracker();
it.tracker(Demo01.class);
}
private void tracker(Class<?> cls) {
Info info = null;
for(Method method:cls.getDeclaredMethods()){
// 判断是否有info注解
if(method.isAnnotationPresent(Info.class)){
System.out.println(method.getName() + "上有info注解...");
// 获取注解
info = method.getAnnotation(Info.class);
System.out.println(info.id() + "\t" + info.desc());
continue;
}
System.out.println(method.getName() + "上没有注解");
}
}
}
元注解的值
@Retention
RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
@Target
ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
ElementType.CONSTRUCTOR 可以给构造方法进行注解
ElementType.FIELD 可以给属性进行注解
ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
ElementType.METHOD 可以给方法进行注解
ElementType.PACKAGE 可以给一个包进行注解
ElementType.PARAMETER 可以给一个方法内的参数进行注解
ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
@Inherited
注解解释:Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}
@Test
public class A {}
public class B extends A {}
注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。
参考:https://zhuanlan.zhihu.com/p/37701743
标签:java,void,class,Inherited,注解,ElementType,public From: https://www.cnblogs.com/slothion/p/18059049