Loading

Java 注解

注解的定义

一个简单的例子

public @interface Ano01 {
    String name() default "xiaoming";
    int age()default 18;
    String[] schools() default {"primary school","high school"};
}

和定义接口类似,只是类型设置为@interface,比interface多一个@

然后参数的定义和函数类似,后面加个default代表设置默认值

特殊属性value

  1. 当注解中只有一个属性且名称是value,在使用注解时给value属性赋值可以直接给属性值,无论value是单值元素还是数组类型。

    // 定义注解Book
    public @interface Book {
        // 书名
        String value();
    }
    
    // 使用注解Book
    public class BookShelf {
        @Book("西游记")
        public void showBook(){
    
        }
    }
    或
    public class BookShelf {
        @Book(value="西游记")
        public void showBook(){
    
        }
    }
    
  2. 如果注解中除了value属性还有其他属性,且至少有一个属性没有默认值,则在使用注解给属性赋值时,value属性名不能省略

    // 定义注解Book
    public @interface Book {
        // 书名
        String value();
        // 价格
        double price() default 100;
        // 多位作者
        String[] authors();
    }
    // 使用Book注解:正确方式
    @Book(value="红楼梦",authors = "曹雪芹")
    public class BookShelf {
      // 使用Book注解:正确方式
        @Book(value="西游记",authors = {"吴承恩","白求恩"})
        public void showBook(){
    
        }
    }
    
    // 使用Book注解:错误方式
    public class BookShelf {
        @Book("西游记",authors = {"吴承恩","白求恩"})
        public void showBook(){
    
        }
    }
    // 此时value属性名不能省略了。
    

注解属性类型可以有以下列出的类型

  1. 基本数据类型
  2. String
  3. 枚举类型
  4. 注解类型
  5. Class类型
  6. 以上类型的一维数组类型

元注解

元注解就是负责给注解进行注解的注解

image-20200802150817293

@Target@Retention在这里给@Overide进行修饰

@Target

用于描述注解在可以被标注在什么地方,函数、类、参数等等

可选的参数值在枚举类ElemenetType中包括:

  • TYPE: 用在类,接口上
  • FIELD:用在成员变量上
  • METHOD: 用在方法上
  • PARAMETER:用在参数上
  • CONSTRUCTOR:用在构造方法上
  • LOCAL_VARIABLE:用在局部变量上

@Retention

它表示注解存在阶段是保留在源码(编译期),字节码(类加载)或者运行期(JVM中运行)

可选的参数值在枚举类型RetentionPolicy中包括

  • SOURCE:注解只存在于Java源代码中,编译生成的字节码文件中就不存在了。
  • CLASS:注解存在于Java源代码、编译以后的字节码文件中,运行的时候内存中没有,默认值。
  • RUNTIME:注解存在于Java源代码中、编译以后的字节码文件中、运行时内存中,程序可以通过反射获取该注解。

@Document

与Javadoc有关

@Inherited

@Inherited注解了的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。

@Repeatable

说明这个注解可以在一个位置被使用多次

内置注解

注解 作用 注意事项
@Override 它是用来描述当前方法是一个重写的方法,在编译阶段对方法进行检查 jdk1.5中它只能描述继承中的重写,jdk1.6中它可以描述接口实现的重写,也能描述类的继承的重写
@Deprecated 它是用于描述当前方法是一个过时的方法
@SuppressWarnings 对程序中的警告去除。

获取注解信息

public class Test06 {
    public static void main(String[] args) throws Exception {
        Class cPerson = Person.class;
        Annotation[] annotations = cPerson.getAnnotations();
        for (Annotation annotation : annotations){
            System.out.println("循环:"+annotation);
        }
        Annotation myTable = cPerson.getAnnotation(MyTable.class);
        System.out.println(myTable);
        System.out.println(((MyTable)myTable).value());

        Field name = cPerson.getDeclaredField("name");
        MyField nameAnnotation = name.getAnnotation(MyField.class);
        System.out.println(nameAnnotation);
        System.out.println(nameAnnotation.column());
        System.out.println(nameAnnotation.type());
        System.out.println(nameAnnotation.length());

    }
}

@MyTable("person_table")
class Person{
    @MyField(column = "col_name",type = "char",length = 20)
    private String name;
    @MyField(column = "col_age",type = "int",length = 20)
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface MyTable{
    String value();
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyField{
    String column();
    String type();
    int length();
}

循环:@com.kehao.MyTable(value=person_table)
@com.kehao.MyTable(value=person_table)
person_table
@com.kehao.MyField(column=col_name, type=char, length=20)
col_name
char
20

posted @ 2021-03-25 20:24  克豪  阅读(61)  评论(0)    收藏  举报