首页 > 其他 > 详细

自定义注解

时间:2020-11-30 23:16:19      阅读:30      评论:0      收藏:0      [点我收藏+]
自定义注解

自定义注解:
1.成员类型是受限的,合法的类型包括原始类型及String,Calss,Anootation,Enumreation
2.如果注解只有一个成员,则成员名必须取名为Value(),在使用的时可以忽略成员名和赋值号(=)
3.没有成员的注解称为标识注解

public @interface Description{//使用@interface关键字注解
String name();//成员以无参无异常方式声明
String author();
int age() default 19;//可以用default为成员变量指定一个默认值
}

元注解br/>@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD})
// Target 注解的作用域 CONSTRUCTOR 构造方法声明,FIELD 字段声明,LOCAL_VARIABLE 局部变量声明 ,METHOD 方法声明,PACKAGE 包声明,PARAMETER 参数声明,TYPE 类接口。
br/>@Retention(RetentionPolicy.RUNTIME)
//Retention 生命周期——SOURCE 只在源码显示,编译时会丢弃;CLASS 编译时会记录到class中,运行时忽略;RUNTIME 运行时存在,可以通过反射读取。
br/>@Inherited
//Inherited 允许子类继承
br/>@Documented
//Documented 生成javadoc的时候包含注解

下面以一个demo演示解析注解

package com.description.demo;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//注解的作用域
@Target({ElementType.METHOD,ElementType.TYPE})
//注解的生命周期
@Retention(RetentionPolicy.RUNTIME)
//注解是否允许被继承
@Inherited
//是否生成注解Javadoc文档子注解
@Documented
public @interface Description {
    String desc();
    String auth()default"rongrong";
}

接口

package com.description.demo;

public interface Person {

    String name();
    int age();
    void say();
}

实现类

package com.description.demo;

@Description(desc = "class annotation")
public class Child implements Person {

    @Override
    @Description(desc = "method annotation")
    public String name() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int age() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void say() {
        // TODO Auto-generated method stub

    }

}

测试类:

/**
 * 
 */
package com.description.demo;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

import org.junit.Test;

/**
 * @author Administrator
 *    解析注解
 */
public class MainTest {

    @SuppressWarnings("unchecked")
    @Test
    public void run(){
        try {
//            通过反射加载实体类
            Class c = Class.forName("com.description.demo.Child");
//            找到类上面的注解
            boolean isExist= c.isAnnotationPresent(Description.class);
            if (isExist) {
//                拿到实体类,一定强转为注解类型,反则找不到
                Description d = (Description) c.getAnnotation(Description.class);
                System.out.println(d.desc());
            }
//            找到方法上的注解
            Method[] method = c.getMethods();
            for (Method ms : method) {
                isExist = ms.isAnnotationPresent(Description.class);
                if (isExist) {
                    Description d = ms.getAnnotation(Description.class);
                    System.out.println(d.desc());
                }
//                另一种方法
                Annotation[] annotation = ms.getAnnotations();
                for (Annotation as : annotation) {
                    if (as instanceof Description) {
                        String desc = ((Description) as).desc();
                        System.out.println(desc);
                    }
                }
            }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

EOF

本文作者:久曲建的测试窝
本文链接:
https://www.cnblogs.com/longronglang/p/6376183.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
优秀不够,你是否无可替代

软件测试交流QQ群:721256703,期待你的加入!!

欢迎关注我的微信公众号:软件测试君
技术分享图片

自定义注解

原文:https://blog.51cto.com/15009374/2557547

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!