Java 注解 - 图1

一、是什么?

一种特殊“注释”——注解(Annotation)。—注解 - 廖雪峰的官方网站

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。—Java 注解(Annotation) | 菜鸟教程

理解:是一种特殊的注释。

二、内置注解(10个)

2.1 作用在代码的注解

  • @Override
  • @Deprecated
  • @SuppressWarnings
  • @SafeVarargs
  • @FunctionalInterface

    2.2 作用在其他注解的注解(元注解)

  • @Repeatable—是否能重复

  • @Target—【必需】使用在字段上,使用在类上等等
  • @Retention—【必需】在运行时使用,在编译期使用等等

    2.3 @Override

    指明其注解的方法是一个重写方法,如果此方法在父类中没有定义,则报错。

    1. class Student extends Person{
    2. @Override
    3. public void run(){
    4. System.out.println("Student run");
    5. }
    6. }
    7. class Person{
    8. // public void run(){
    9. // System.out.println("Person run!");
    10. // }
    11. }

    三、如何使用(一个判断字段长度的例子)

    3.1 定义注解

    1. @interface Range{
    2. int min() default 0;
    3. int max() default 255;
    4. }

    3.2 给注解添加元注解

    1. @Retention(RetentionPolicy.RUNTIME)
    2. @Target(ElementType.FIELD)
    3. @interface Range{
    4. int min() default 0;
    5. int max() default 255;
    6. }

    3.3 使用注解

    1. class Person{
    2. @Range(min = 50,max = 100)
    3. public int age;
    4. @Range(max = 5)
    5. public String name;
    6. Person(int age,String name){
    7. this.age = age;
    8. this.name = name;
    9. }
    10. }

    现有没有作用,还需要编写对应的处理方法。

    3.4 注解对应的处理方法

    ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Field;

public class Hi { public static void main(String[] args) throws Exception { Person p1 = new Person(12,”Bob”); Person p2 = new Person(1002,”Bo555555555555555555555555555555555555b”); // System.out.println(p1.getClass().getFields()[0]); for(var p:new Person[]{p1,p2}){ try { check(p); System.out.println(“Person “+p+” checked ok”); } catch (Exception e) { System.out.println(“Person “+p+” checked failed:”+e); } } }

  1. static void check(Person person) throws IllegalAccessException,ReflectiveOperationException{
  2. for(Field field:person.getClass().getFields()){
  3. Range range = field.getAnnotation(Range.class);
  4. if(range!=null){
  5. Object value = field.get(person);
  6. if(value instanceof String){
  7. String s = (String) value;
  8. if(s.length()<range.min()||s.length()>range.max()){
  9. throw new IllegalAccessException("Invaild field:"+field.getName());
  10. }
  11. }
  12. }
  13. }
  14. }

}

class Person{ @Range(min = 50,max = 100) public int age; @Range(max = 5) public String name;

  1. Person(int age,String name){
  2. this.age = age;
  3. this.name = name;
  4. }

}

@Retention(RetentionPolicy.RUNTIME)//指明使用范围为“运行时” @Target(ElementType.FIELD)//定义使用的位置为“字段” @interface Range{ int min() default 0; int max() default 255; } ```

参考

  1. 注解 - 廖雪峰的官方网站
  2. Java 注解(Annotation) | 菜鸟教程