@interface 自定义注解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zyb2017/article/details/78827525

一 前言

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

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


}

5.运行结果

运行结果

猜你喜欢

转载自blog.csdn.net/zyb2017/article/details/78827525