注解,或者叫注释类型,annotation

注解 Annotation 是一种引用数据类型,编译之后也是生成 xxx.class 文件

自定义注解:
[修饰符列表] @interface 注解类型名{ }
(在新建的时候,有专门的 annotation 选择)

注解的使用:

  1. 注解使用的语法格式是:@注解类型名
  2. 注解可以出现在类上,属性上,方法上,变量上等,甚至可以是注解类型上

注解里面有属性的话,就必须在使用的时候给属性指定值
也可以指定默认值,指定以后,就可以不写了

/*
自定义注解:myannotation
 */
public @interface myannotation {
    String name();
    String age() default "23";
}
public class Annotation {
    @myannotation(name = "jack")
    private int no;

但是,如果一个注解的属性的名字是 value 的话,并且只有一个属性的话,可以不用写属性名,直接写就好了

注解的使用,可以是基本数据类型,也可以到枚举,数组

Override Deprecated Target Rentention 这几个,需要知道如何使用

通过反射机制,拿到注解中属性的值

public class annotation {

    @Myannotation(username = "zhangsan", password = "123")
    public void doSome() {

    }

    public static void main(String[] args) throws Exception {
        //获取 annotation的 doSome()方法上面的注解信息
        Class c = Class.forName("testdemo.annotation");
        //获取doSome()方法
        Method m = c.getDeclaredMethod("doSome");
        //判断该方法是否存在注解
        if (m.isAnnotationPresent(Myannotation.class)) {
            Myannotation myannotation = m.getAnnotation(Myannotation.class);
            System.out.println(myannotation.username());
            System.out.println(myannotation.password());
        }
    }
}

自定义的注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Myannotation {
    String username();

    String password();
}

模拟一个需求:

  • 假设有这样一个注解,叫做:@id。这个注解只能出现在类上,当这个类上有这个注解的时候,要求这个类中必有有一个 int 类型的 id 属性。如果没有这个属性就报异常。如果有这个属性则正常执行。

首先把注解写出来:

//表示这个注解只能出现在类上面
@Target(ElementType.TYPE)
//表示该注解可以被反射机制读取到
@Retention(RetentionPolicy.RUNTIME)
public @interface Id {

}

再自己定义一个类

@Id
public class annotation{
    int id;
    String name;
    String age;
}

再来验证这个类里面,是否按要求规范写了 int 类型的 id

public class Test {
    public static void main(String[] args) throws Exception{
        Class c = Class.forName("testdemo.annotation");

        //判断类上是否存在 Id 注解
        if (c.isAnnotationPresent(Id.class)) {
            //如果没有 int 类型的 id 则报异常
            Field[] fields = c.getDeclaredFields();
            boolean isOk = false;
            for (Field field : fields) {
                if ("id".equals(field.getName()) && "int".equals(field.getType().getSimpleName())) {
                    //表示这个类是合法的类,有@Id 注解,这个类中必须哦雨 int 类型 id
                    isOk = true;//表示合法了
                    break;
                }
            }
            //判断是否合法
            if (!isOk) {
                throw new HasNotIdPropertyException("@Id 标注的类中必须要有一个 int 类型的id 属性");
            }
        }
    }
}

这里插一个,自定义的异常类

public class HasNotIdPropertyException extends RuntimeException{
    public HasNotIdPropertyException() {
    }

    public HasNotIdPropertyException(String message) {
        super(message);
    }
}