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

自定义注解的基本使用

程序员文章站 2022-04-14 16:39:39
0.使用自定义注解前,先了解相关元注解 java.lang.annotation 提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用到元注解): @Documented – 注解是否将包含在JavaDoc中 @Retention – 什么时候使用该注解 @Target – 注解用于什 ......

0.使用自定义注解前,先了解相关元注解

java.lang.annotation 提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用到元注解):
   @documented – 注解是否将包含在javadoc中
   @retention – 什么时候使用该注解
   @target – 注解用于什么地方
   @inherited – 是否允许子类继承该注解

  1.)@retention – 定义该注解的生命周期
  ●   retentionpolicy.source : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@override, @suppresswarnings都属于这类注解。
  ●   retentionpolicy.class : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式
  ●   retentionpolicy.runtime : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

  2.)target – 表示该注解用于什么地方。默认值为任何元素,表示该注解用于什么地方。可用的elementtype 参数包括
  ● elementtype.constructor: 用于描述构造器
  ● elementtype.field: 成员变量、对象、属性(包括enum实例)
  ● elementtype.local_variable: 用于描述局部变量
  ● elementtype.method: 用于描述方法
  ● elementtype.package: 用于描述包
  ● elementtype.parameter: 用于描述参数
  ● elementtype.type: 用于描述类、接口(包括注解类型) 或enum声明

 3.)@documented – 一个简单的annotations 标记注解,表示是否将注解信息添加在java 文档中。

 4.)@inherited – 定义该注释和子类的关系
     @inherited 元注解是一个标记注解,@inherited 阐述了某个被标注的类型是被继承的。如果一个使用了@inherited 修饰的annotation 类型被用于一个class,则这个annotation 将被用于该class 的子类。

1.自定义注解类编写的一些规则

1. annotation 型定义为@interface, 所有的annotation 会自动继承java.lang.annotation这一接口,并且不能再去继承别的类或是接口.
  2. 参数成员只能用public 或默认(default) 这两个访问权修饰
  3. 参数成员只能用基本类型byte、short、char、int、long、float、double、boolean八种基本数据类型和string、enum、class、annotations等数据类型,以及这一些类型的数组.
  4. 要获取类方法和字段的注解信息,必须通过java的反射技术来获取 annotation 对象,因为你除此之外没有别的获取注解对象的方法
  5. 注解也可以没有定义成员,,不过这样注解就没啥用了
ps:自定义注解需要使用到元注解

2.实例

animalname.java

package com.xiaojian.basics.annotation;
/**
 * 动物种类
 */
import java.lang.annotation.documented;
import java.lang.annotation.retention;
import java.lang.annotation.target;

import static java.lang.annotation.elementtype.field;
import static java.lang.annotation.retentionpolicy.runtime;

@target(field)
@retention(runtime)
@documented
public @interface animalname {
    string value() default "";
}

animalcolor.java

package com.xiaojian.basics.annotation;

import java.lang.annotation.documented;
import java.lang.annotation.retention;
import java.lang.annotation.target;

import static java.lang.annotation.elementtype.field;
import static java.lang.annotation.retentionpolicy.runtime;
/**
 * 动物颜色
 */
@target(field)
@retention(runtime)
@documented
public @interface animalcolor {
    /**
     * 颜色枚举
     */
    public enum color{黑色,白色,灰色,杂色};

    color animalcolor() default color.白色;
}

animalmaster.java

package com.xiaojian.basics.annotation;

import java.lang.annotation.documented;
import java.lang.annotation.retention;
import java.lang.annotation.target;

import static java.lang.annotation.elementtype.field;
import static java.lang.annotation.retentionpolicy.runtime;

/**
 * 动物主人
 */

@target(field)
@retention(runtime)
@documented
public @interface animalmaster {

    int id() default -1;

    string name() default "";

    string address() default "";
}

animalinfoutil.java

package com.xiaojian.basics.annotation;

import java.lang.reflect.field;

/**
 * 返回动物信息
 */
public class animalinfoutil {

    public static void getinfo(class<?> clazz){

        stringbuilder stranimalname = new stringbuilder( "动物种类:");
        stringbuilder stranimalcolor = new stringbuilder( "动物颜色:");
        stringbuilder stranimalprovider = new stringbuilder( "主人信息:");

        field[] fields = clazz.getdeclaredfields();

        for(field field : fields){
            if(field.isannotationpresent(animalname.class)){
                animalname animalanimal = (animalname)field.getannotation(animalname.class);
                stranimalname.append(animalanimal.value());
                system.out.println(stranimalname);
            } else if(field.isannotationpresent(animalcolor.class)){
                animalcolor animalcolor = (animalcolor)field.getannotation(animalcolor.class);
                stranimalcolor.append(animalcolor.animalcolor().tostring());
                system.out.println(stranimalcolor);
            } else if(field.isannotationpresent(animalmaster.class)){
                animalmaster animalmaster = (animalmaster)field.getannotation(animalmaster.class);
                stranimalprovider.append("[编号:" + animalmaster.id() + ",主人名字:" + animalmaster.name() + ",地址:" + animalmaster.address() + "]");
                system.out.println(stranimalprovider);
            }

        }

    }
}

测试:

package com.xiaojian.basics.annotation;

/**
  * 测试类
  */
public class test {
    public static void main(string[] args) {
        animalinfoutil.getinfo(animal.class);
    }

}

返回:

动物种类:狗
动物颜色:黑色
主人信息:[编号:1,主人名字:小明,地址:浙江省杭州市xxxxxxxx]

【参考链接】

https://www.cnblogs.com/acm-bingzi/p/javaannotation.html