深入理解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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 内外网数据库同步方式「建议收藏」

    内外网数据库同步方式「建议收藏」项目环境:公司中心有一个数据库,产品部署地有多个,每个部署地是一个局域网,部署地内有一台对外通讯的服务器(可能会断网)。项目需要将每个部署地的部分数据,同步到中心数据库。基本思路:在需要同步的数据库的说明中添加Update标识,在需要同步的表中添加UpdateDate字段。在每一天的0点时候,会执行一次同步,根据UpdateDate字段进行时间比对,同步会遍历当前数据库的所以后表,如果表中包含

    2022年10月16日
    2
  • mysql字符串拼接的方法_sql中拼接字符串的方法

    mysql字符串拼接的方法_sql中拼接字符串的方法总是记不住字符串拼接,每次都要百度去搜索,所以在这里记录一下,好方便后续的查找,如有错误和问题可以提出,谢谢。字符串拼接分为几种方式,在这里会一一举例写出:第一种:mysql自带语法CONCAT(string1,string2,…),此处是直接把string1和string2等等的字符串拼接起来(无缝拼接哦)说明:此方法在拼接的时候如果有一个值为NULL,则返回NULL…

    2022年9月30日
    2
  • 迅雷种子为什么php文件后缀,迅雷BT文件后缀是什么?[通俗易懂]

    迅雷种子为什么php文件后缀,迅雷BT文件后缀是什么?[通俗易懂]你是否正在寻找关于文件后缀的内容?让我把最实时的东西奉献给你:迅雷BT文件后缀是什么?BT是一个后缀名为.torrent的小文件,它里面保存了服务器地址、要下载的文件的大孝分成的块数以及各种下载参数设置,这个文件一般在20k-100k大小,可以把*.php直接改成*.torrent试试!要么就是文件制作出错!在去这个页面下载一次,当弹出迅雷下载的时候点取消.让Windows下载.会出现保存对话框…

    2025年8月11日
    4
  • Java 继承、多态与类的复用

    Java 继承、多态与类的复用本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍。首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同。紧接着,我们根据继承引入了多态,介绍了它的实现机制和具体应用。此外,为了更好地理解继承和多态,我们对final关键字进行了全面的介绍。在此基础上,我们介绍了Java中类的加载及初始化顺序。最后,我们对面向对象设计中三个十分重要的概念-重载、覆盖与隐藏进行了详细的说明。

    2022年7月8日
    16
  • 解决使用Nginx错误 Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING问题

    解决使用Nginx错误 Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING问题Failedtoloadresource:net::ERR_INCOMPLETE_CHUNKED_ENCODING问题先说解决办法:直接删除Nginx缓存文件即可;问题描述:使用Nginx代理的服务,一直使用正常,突然昨天就访问不了了;通过IP访问和端口能正常访问。原本以为是请求头文件过大导致资源未加载完问题;然后修改了Tomcat中配置中的请求头文件,在Tomcat的…

    2025年8月11日
    1
  • 2021年前端面试题及答案

    前端面试汇总(2020年)一大纲1、前言2、前端工程化3、前端设计模式4、前端安全性问题5、前端跨域问题6、前端数据加密7、前端http相关问题8、*前端基础知识点面试题9、前端技术栈问题前言由于新冠肺炎疫情,现在成天呆在家里,加上也要准备面试,就在家里看面试题…

    2022年4月6日
    52

发表回复

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

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