标注在代码里面的注解,称为代码注解
注解 | 描述 |
---|---|
override | 标记在子类中重写了父类的方法,如果不是则会报错 |
deprecated | 标记此方法已经过时了 |
suppressWarnings | 忽略注解声明的警告 |
注解 | 描述 |
---|---|
retention | 标记注解怎么保存 |
documented | 使用此注解可以让注解保存到javadoc文档中 |
target | 标记注解的作用域 |
Inherirted | 标记注解有继承性 |
注解 | 描述 |
---|---|
SafavarArgs | 忽略方法或者构造方法的参数为泛型所产生的警告 |
FuntionalInterface | 标注一个函数性接口 |
repeatable | 标识某注解可以在同一个声明上使用多次 |
package java.lang.annotation;
public interface Annotation {
boolean equals(Object obj);
int hashCode();
String toString();
Class<? extends Annotation> annotationType();
}
public enum ElementType {
TYPE, //在接口、类、枚举上声明注解
METHOD,//在方法上声明注解
FIELD,//在字段上声明注解
PARAMETER,//在参数上声明注解
LOCAL_VARIABLE,//在局部变量上声明注解
PACKET,在包上声明注解
CONSTRUCTOR,//在构造方法上声明注解
ANNOTATIONTYPE,//在注解类型上声明注解
}
public enum RtentionPolicy {
SOURCE, //注解信息存在代码的编译过程,编译结束,注解结束
CLASS, //注解信息保存在字节码文件中
RUNTIME //注解信息保存在字节码文件中,并可以被JVM虚拟机读取
}
@Doucumented
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
关键字 | 描述 |
---|---|
deprecation | 忽略使用不被赞成、过时所产生的警告 |
unchecked | 忽略集合中没有声明类型的所产生的警告 |
fallthrouth | switch程序块,忽略下一种情况没有break的情况 |
path | 忽略类地址、源路径不存在的警告 |
serial | 序列化的时候,忽略类中缺少serialVersionUUid警告 |
finally | 忽略finally语句块不能正常执行的的警告 |
all | 忽略以上所有的警告 |
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
package reflect;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
//@Inherited
@Documented
@Retention(RUNTIME)
@Target({TYPE,FIELD,METHOD})
public @interface AnnnotationOne {
}
2、编写一个父类
package reflect;
@AnnnotationOne
public class Person {
}
3、编写一个子类
package reflect;
public class Teacher extends Person {
public static void main(String[] args) {
Class<Teacher> teacherClass = Teacher.class;
boolean annotationPresent = teacherClass.isAnnotationPresent(AnnnotationOne.class);
System.out.println(annotationPresent);
}
}
响应
示例2被Inherited 修饰的注解
1、编写一个注解
package reflect;
import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Inherited
@Documented
@Retention(RUNTIME)
@Target({TYPE,FIELD,METHOD})
public @interface AnnnotationOne {
}
2、编写一个父类
package reflect;
@AnnnotationOne
public class Person {
}
3、编写一个子类
package reflect;
public class Teacher extends Person {
public static void main(String[] args) {
Class<Teacher> teacherClass = Teacher.class;
boolean annotationPresent = teacherClass.isAnnotationPresent(AnnnotationOne.class);
System.out.println(annotationPresent);
}
}
package reflect;
import java.lang.annotation.Annotation;
public class Teacher extends Person {
public static void main(String[] args) {
//获取Teacher的class对象
Class<Teacher> teacherClass = Teacher.class;
//获取父类的class对象
Class<? super Teacher> superclass = teacherClass.getSuperclass();
//获取指定的注释对象
AnnnotationOne Annotation = superclass.getAnnotation(AnnnotationOne.class);
//获取注解的值
String[] value = Annotation.value();
for (String a :value){
System.out.println(a);
}
System.out.println("=================================");
Annotation[] annotations = superclass.getAnnotations();
for (Annotation annotation:annotations){
System.out.println(annotation);
}
}
}