一、是什么?
一种特殊“注释”——注解(Annotation)。—注解 - 廖雪峰的官方网站
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。—Java 注解(Annotation) | 菜鸟教程
二、内置注解(10个)
2.1 作用在代码的注解
- @Override
- @Deprecated
- @SuppressWarnings
- @SafeVarargs
-
2.2 作用在其他注解的注解(元注解)
@Repeatable—是否能重复
- @Target—【必需】使用在字段上,使用在类上等等
@Retention—【必需】在运行时使用,在编译期使用等等
2.3 @Override
指明其注解的方法是一个重写方法,如果此方法在父类中没有定义,则报错。
class Student extends Person{@Overridepublic void run(){System.out.println("Student run");}}class Person{// public void run(){// System.out.println("Person run!");// }}
三、如何使用(一个判断字段长度的例子)
3.1 定义注解
@interface Range{int min() default 0;int max() default 255;}
3.2 给注解添加元注解
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)@interface Range{int min() default 0;int max() default 255;}
3.3 使用注解
class Person{@Range(min = 50,max = 100)public int age;@Range(max = 5)public String name;Person(int age,String name){this.age = age;this.name = name;}}
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); } } }
static void check(Person person) throws IllegalAccessException,ReflectiveOperationException{for(Field field:person.getClass().getFields()){Range range = field.getAnnotation(Range.class);if(range!=null){Object value = field.get(person);if(value instanceof String){String s = (String) value;if(s.length()<range.min()||s.length()>range.max()){throw new IllegalAccessException("Invaild field:"+field.getName());}}}}}
}
class Person{ @Range(min = 50,max = 100) public int age; @Range(max = 5) public String name;
Person(int age,String name){this.age = age;this.name = name;}
}
@Retention(RetentionPolicy.RUNTIME)//指明使用范围为“运行时” @Target(ElementType.FIELD)//定义使用的位置为“字段” @interface Range{ int min() default 0; int max() default 255; } ```
