注解,或者叫注释类型,annotation
注解 Annotation 是一种引用数据类型,编译之后也是生成 xxx.class 文件
自定义注解:
[修饰符列表] @interface 注解类型名{ }
(在新建的时候,有专门的 annotation 选择)
注解的使用:
- 注解使用的语法格式是:@注解类型名
- 注解可以出现在类上,属性上,方法上,变量上等,甚至可以是注解类型上
注解里面有属性的话,就必须在使用的时候给属性指定值
也可以指定默认值,指定以后,就可以不写了
/*
自定义注解: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);
}
}