一 前言
最近一直在搭建各种环境,编码写的少了,工作用到自定义注解,记录学习一下
二 Java元注解
在开始自定义注解之前我们需要了解元注解,那什么是元注解呢?
5个字:注解的注解。来帮我们描述定义注解,包括:
//Annotation被保留的时间长短,注解的保留位置
@Retention
//Annotation所修饰的对象范围
@Target
//说明该注解将被包含在javadoc中
@Document
//说明子类可以继承父类中的该注解
@Inherited
他们也有不同的参数用来描述
@Retention :
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target :
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE) //局部变量
@Target(ElementType.ANNOTATION_TYPE) //注解
@Target(ElementType.PACKAGE) //包
三 定义注解
举个例子:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface User {
// Permissions value() default Permissions.READ;
}
四 测试
1.定义Operator
package annotation;
/**
* Created by zyb on 2017/12/17.
*
*/
public class Operator {
public static enum Permissions {
/**
* 无权限
*/
NONE(0),
/**
* 只读
*/
READ(1),
/**
* 写入
*/
WRITE(2),
/**
* 管理员
*/
MANAGE(3);
private int permissionsNumber;
private Permissions(int permissionsNumber) {
this.permissionsNumber = permissionsNumber;
}
public int getPermissionsNumber() {
return permissionsNumber;
}
public void setPermissionsNumber(int permissionsNumber) {
this.permissionsNumber = permissionsNumber;
}
}
}
2.定义User注解
package annotation;
import java.lang.annotation.*;
import annotation.Operator.Permissions;
/**
* 用来描述Person权限
* Created by zyb on 2017/12/17.
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface User {
Permissions value() default Permissions.READ;
}
3.定义Person
package annotation;
import annotation.Operator.Permissions;
/**
* Created by zyb on 2017/12/17.
*/
public class Person {
@User(Permissions.NONE)
private int permissions0;
@User(Permissions.READ)
private int permissions1;
@User(Permissions.WRITE)
private int permissions2;
@User(Permissions.MANAGE)
private int permissions3;
public int getPermissions0() {
return permissions0;
}
public int getPermissions1() {
return permissions1;
}
public int getPermissions2() {
return permissions2;
}
public int getPermissions3() {
return permissions3;
}
}
4.测试CheckPerson
package annotation;
import java.lang.reflect.Field;
/**
* Created by 周昱博 on 2017/12/17.
*/
public class CheckPerson {
public static void check(String clas) {
try {
Class<?> cls = Class.forName(clas);
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(User.class) == true) {
User user = field.getAnnotation(User.class);
System.out.println("User Permissions: " + user.value() + "\nval: "+ user.value().getPermissionsNumber());
}
System.out.println();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
check("annotation.Person");
}
}