一、是什么?
一种特殊“注释”——注解(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{
@Override
public 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; } ```