深入理解Java自定义注解(二)-使用自定义注解

深入理解Java自定义注解(二)-使用自定义注解

大家好,又见面了,我是全栈君。

java的注解处理器类主要是AnnotatedElement接口的实现类实现,为位于java.lang.reflect包下。由下面的class源码可知AnnotatedElement接口是所有元素的父接口,这时我们通过反射获得一个类的AnnotatedElement对象后,就可以通过下面表格的几个方法,访问Annotation信息。

public final class Class<T> implements java.io.Serializable, GenericDeclaration, Type, AnnotatedElement {

总结AnnotatedElement的常用方法 输入图片说明

注意:getDeclaredAnnotations和getAnnotations得到的都是当前类上面所有的注解(不包括方法上注解和属性上注解),不同的是,前者不包括继承的。而getAnnotations得到的是包括继承的所有注解。

注解处理器使用示例

新建自定注解@ReqMapping

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

/**
 * Description:
 * Created by gaowei on 2018/1/3.
 */
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ReqMapping {

    ReqMethod [] method() default {};

    String[] val() default "";
}

新建一个枚举类

public enum ReqMethod {
        GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}

新建自定义注解@ReqValue

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

/**
 * Description:
 * Created by gaowei on 2018/1/4.
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ReqValue {

    String value1() default "";

    String value2() default "";
}

使用自定义注解

@ReqMapping(method = ReqMethod.POST,val = "类")
public class User  {

    @ReqValue(value1 = "张三")
    private String userName;

    @ReqValue(value2 = "密码")
    private String pswd;


    @ReqMapping(method = ReqMethod.GET)
    public void get(){

    }

    @ReqMapping(method = ReqMethod.POST)
    public void post(){

    }

    @ReqMapping(val={"a","b"})
    public void other(){

    }

}

注解处理器测试

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

/**
 * Description:
 * Created by gaowei on 2018/1/2.
 */
public class TestAnnotation {

    public static void main(String[] args) {
        Class<User> clazz = User.class;

        //获得clazz(User)里面所有方法信息
        Method[] methods = clazz.getDeclaredMethods();

        //获得clazz(User)里面所有属性信息
        Field[] declaredFields = clazz.getDeclaredFields();

        System.out.println("methods注解个数:"+methods.length);
        System.out.println("declaredFields注解个数:"+declaredFields.length);

        //遍历循环所有方法信息
        for (Method method : methods) {
            //判断method是否含有指定元素的注解
            if (method.isAnnotationPresent(ReqMapping.class)) {
                //返回当前方法上的注解对象
                ReqMapping reqMapping = method.getAnnotation(ReqMapping.class);
                //获得注解的值
                System.out.println("方法注解值:"+reqMapping.method());

                //如果一个注解有多个值,通过遍历取出(特别注意:reqMapping.val(),这个val()是你定义注解的成员)
                String[] values = reqMapping.val();
                for (String value : values) {
                    System.out.println(value);
                }
            }
        }

        //获得类里面所有方法的注解信息
        for (Field declaredField : declaredFields) {
            if(declaredField.isAnnotationPresent(ReqValue.class)){
                ReqValue reqValue = declaredField.getAnnotation(ReqValue.class);
                System.out.println("属性注解值:"+reqValue.value1());
                System.out.println("属性注解值:"+reqValue.value2());
            }
        }

        //获得类上的所有注解
        Annotation[] declaredAnnotations = clazz.getDeclaredAnnotations();
        for (Annotation declaredAnnotation : declaredAnnotations) {
            System.out.println("类注解值:"+ declaredAnnotation);
        }

    }
}

其他博文

深入理解Java自定义注解(一):入门:https://my.oschina.net/itgaowei/blog/1600525

深入理解Java自定义注解(二)-使用自定义注解:https://my.oschina.net/itgaowei/blog/1602277

转载于:https://my.oschina.net/itgaowei/blog/1602277

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107778.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • LaTeX(4)——LaTeX插入图片「建议收藏」

    LaTeX(4)——LaTeX插入图片「建议收藏」转载请注明作者和出处:https://blog.csdn.net/qq_28810395运行平台:Windows10环境加编译器:Texlive2020+Texstudio编辑器如有需要IEEE模板文件的可以关注Stefan0704回复IEEE进行获取。前言  在Paper的排版中,对于图片的排版也是重点之一,一篇好的Paper,图片排版的不规范,直接决定了读者对Paper的第一印象,所以下面分享一下图片排版方法。排版方式图片的插入很简单呢,一般就是如下述的代码与结果所示,插入.

    2022年5月18日
  • springboot实现文件上传到数据库_javaweb将数据写入数据库

    springboot实现文件上传到数据库_javaweb将数据写入数据库一、添加pom依赖<!–excel解析包–><!–https://mvnrepository.com/artifact/org.apache.poi/poi–&g

    2022年8月16日
  • 100行Html5+CSS3+JS代码实现元旦倒计时界面

    一、前言二、圣诞树效果展示:三、步骤如果之前看过我这篇文章的1.下载VSCode下载链接:VSCode在Hbuilder、idea运行也是可以的,这里推荐使用VSCode2.配置插件三个插件对应的功能:改写标签后自动完善 切换成中文页面 让代码在网页中打开,默认键Alt+B3.构建三个文件在桌面新建一个空的文件夹,用VSCode打开 在VSCode新建三个文件index.htmldomtree….

    2022年4月7日
  • Intellij IDEA 安装lombok及使用详解

    Intellij IDEA 安装lombok及使用详解项目中经常使用bean,entity等类,绝大部分数据类类中都需要get、set、toString、equals和hashCode方法,虽然eclipse和idea开发环境下都有自动生成的快捷方式,但自动生成这些代码后,如果bean中的属性一旦有修改、删除或增加时,需要重新生成或删除get/set等方法,给代码维护增加负担。而使用了lombok则不一样,使用了lombok的注解(@Setter,@Getter,@ToString,@@RequiredArgsConstructor,@EqualsAndHas

    2022年6月17日
  • mt4数据api接口_外汇api

    mt4数据api接口_外汇api1、MT4API交易接口是什么?MT4Api接口是跨平台多账号交易接口,是将MT4交易通道以API的方式聚合在一起,帮助开发商在各经纪商不提供manager后台账号、无须EA插件的情况下,也能轻松接入不同的MT4交易平台,完成登录、交易和订单查询的功能,真正实现跨平台交易,减少巨额的人工成本和硬件成本。适合开发行情展示或者订单管理,交易策略等,如果开发实力可以,你甚至可以用他开发一个MT4客户端!此MT4API比使用MT4终端进行报价和交易要快得多;提供实时开仓、平仓等多种功能。2、MT4API的协

    2022年9月10日
  • Java大数据学习路线图

    Java大数据学习路线图Java大数据学习路线图准备篇适用/适合人群:适合基础小白在这里还是要推荐下我自己建的大数据学习群:199427210,群里都是学大数据开发的,如果你正在学习大数据,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有大数据软件开发相关的),包括我自己整理的一份最新的大数据进阶资料和高级开发教程,欢迎进阶中和进想深入大数据的小伙伴加入。目标:掌握JavaS…

    2022年5月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号