欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

@interface 自定义注解

程序员文章站 2024-03-15 14:14:47
...

一 前言

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

二 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.运行结果

@interface 自定义注解