
内置注解
作用在代码中的注解
| 注解 | 作用 |
|---|---|
| @Override | 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误 |
| @Deprecated | 标记过时方法。如果使用该方法,会报编译警告 |
| @SuppressWarnings | 指示编译器去忽略注解中声明的警告。 |
| @SafeVarargs | 忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。 |
| @FunctionalInterface | 标识一个匿名函数或函数式接口 |
作用在其他注解的注解(或者说元注解)是:
| 注解 | 作用 |
|---|---|
| @Retention | 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问 |
| @Documented | 标记这些注解是否包含在用户文档中 |
| @Target | 标记这个注解应该是哪种 Java 成员 |
| @Inherited | 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类) |
| @Repeatable | 标识某注解可以在同一个声明上使用多次 |
@SafeVarargs:
public class SafeVarargsTest {public static void main(String[] args) {ArrayList<Integer> a1 = new ArrayList <>();a1.add(1);a1.add(2);showArgs(a1, 12);}//如果没有此注解,会报出警告@SafeVarargspublic static <T> void showArgs(T... array) {for (T arg : array) {System.out.println(arg.getClass().getName() + ":" + arg);}}}
输出:
java.util.ArrayList:[1, 2]java.lang.Integer:12
源码:
@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})public @interface SafeVarargs {}
@Documented
:表明该注解可以包含在用户文档中。@Retention(RetentionPolicy.RUNTIME)
:@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})
:
RetentionPolicy:
| 枚举常量 | 说明 |
|---|---|
| SOURCE | Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了 |
| CLASS | 编译器将Annotation存储于类对应的.class文件中。默认行为 |
| RUNTIME | 编译器将Annotation存储于class文件中,并且可由JVM读入 |
package java.lang.annotation;public enum RetentionPolicy {SOURCE,CLASS,RUNTIME}
ElementType:
| 枚举常量 | 说明 |
|---|---|
| TYPE | 类、接口(包括注解类型)或枚举声明 |
| FIELD | 字段声明(包括枚举常量) |
| METHOD | 方法声明 |
| PARAMETER | 参数声明 |
| CONSTRUCTOR | 构造方法声明 |
| LOCAL_VARIABLE | 局部变量声明 |
| ANNOTATION_TYPE | 注释类型声明 |
| PACKAGE | 包声明 |
| TYPE_PARAMETER | 类型参数声明 |
| TYPE_USE | 类型的使用 |
| MODULE | 模块声明 |
| RECORD_COMPONENT | 记录组件 |
package java.lang.annotation;public enum ElementType {TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE,ANNOTATION_TYPE,PACKAGE,TYPE_PARAMETER,TYPE_USE,MODULE,@jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS,essentialAPI=true)RECORD_COMPONENT;}
自定义注解
属性:接口中的抽象方法
要求:
属性的返回值类型有下列取值
基本数据类型
String
枚举
注解
以上类型的数组
定义了属性,在使用时需要给属性赋值
如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略
MyAnno
@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface MyAnno {String name() default "wenwen";int age();}
Person
@MyAnno(name = "xiaowenwen", age = 11)public class Person {private String name;private int age;@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}public Person() {}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}}
Test1
public class Test1 {public static void main(String[] args) {Person person = new Person();try {//获取Person的Class对象Class<Person> personClass = Person.class;//判断person对象上是否有 MyAnno注解if (personClass.isAnnotationPresent(MyAnno.class)) {MyAnno myAnno = personClass.getAnnotation(MyAnno.class);person.setName(myAnno.name());person.setAge(myAnno.age());System.out.println(person);} else {System.out.println("Person类上没有配置 MyAnno注解!");}} catch (Exception e) {e.printStackTrace();}}}
最后修改时间:2021-02-05 15:08:14
文章转载自Hello 帅帅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




