Java 注解
1、什么是注解
注解是一种元数据,代码级别的声明,jdk1.5之后引入特殊的说名。
注解可以在包/类/字段/方法/构造器/参数,上面使用。
注解仅起到标识性的作用,没有任何功能,是一种特殊的接口。
注解的本质就是一个接口,继承Annotation接口
2、注解的定义
①属性列表的类型
属性列表参数的本质就是接口中的抽象方法。
属性只能是以下几种数据类型:
- 基本数据类型
- String
- 枚举
- 注解
- 以上类型的数组
注!
- 如果只有一个属性需要赋值,并且这个属性叫value,那么使用的时候就可以省略属性名称。
- 数组赋值时,值用大括号包裹,如果只有一个值,大括号可以省略
- 属性有默认值时可以不给该属性值。
②定义注解
public @interface 注解名称 {
属性列表;
}
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME) //运行时生效
public @interface TestAnnotation {
String value(); //声明接口的方式,定义注解,当参数为value时,可以省略不写
String name() default "inter"; //定义注解并指定默认值,有默认值的参数,可以在写注解的时候不给定值
int id();
}
③元注解
用于描述注解的注解:
- @Target:取值ElementType数组,描述注解的作用范围
//取值分别作用于:类/方法/字段/构造器
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR})
- @Retention:取值RetentionPolicy,描述注解的作用范围
//当前的注解描述会被保留到class字节码当中,并被jvm读取到
@Retention(RetentionPolicy.RUNTIME)
- @Document
//描述注解是否会被抽取到API文档中
@Documented
- @Inherited
//描述注解是否可以被继承
@Inherited
3、使用注解结合反射实现案例
①注解实现登录验证
public class Test {
private final static User[] users = {
new User("yyy"),
new User("ddd"),
new User("zzz"),
new User("qqq"),
new User("aaa")
};
private final static String LOGIN_FLAG = "0"; //1表示登录了
@LoginAnnotation //进入方法之前验证是否登录
public static User getUserById(Integer id) {
System.out.println("查询的当前用户是:" + users[id]);
return users[id];
}
//通过是否具备注解进行用户登录验证
public static void vailUserLogin(Object obj) throws Exception {
Class<?> aClass = obj.getClass();
Method[] methods = aClass.getDeclaredMethods();
for (Method method : methods) {
LoginAnnotation loginAnnotation = method.getAnnotation(LoginAnnotation.class);
if (loginAnnotation != null) {
//验证是否登录
if ("1".equals(LOGIN_FLAG)) {
System.out.println("用户已经登录");
} else {
throw new RuntimeException("用户未登录...");
}
}
}
}
public static void main(String[] args) throws Exception {
vailUserLogin(new Test()); //执行不通过,不会执行下面的语句
getUserById(1);
}
}
@Target(value = {ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME) //运行时
public @interface LoginAnnotation {
}