@interface 自定义注解

来源:互联网 发布:长沙网络推广外包 编辑:程序博客网 时间:2024/06/07 09:57

一 前言

最近一直在搭建各种环境,编码写的少了,工作用到自定义注解,记录学习一下

二 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)@Documentedpublic @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)@Documentedpublic @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");    }}

5.运行结果

运行结果

原创粉丝点击