深入理解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)
上一篇 2022年3月12日 下午9:35
下一篇 2022年3月12日 下午9:35


相关推荐

  • 变性跨性别_女变男的漫画

    变性跨性别_女变男的漫画這是一個未完成,也永遠不會完成的列表更新日期:2013/09/08類型:裝=異性裝/偽娘,轉=性轉換/變性,間=雌雄間性/陰陽人/無性/フタナリ,跨=跨性別(含有現實跨性別意涵者)中文題名/,原文題

    2022年8月4日
    9
  • java 三大特性_java的三大特性是什么?

    java 三大特性_java的三大特性是什么?java的三大特性Java语言的三大特性即是:封装、继承、多态首先先简单的说一下其3大特性的定义:封装:在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。将抽象得到的…

    2022年7月8日
    29
  • woe分析_信用评分模型中WOE、IV详解

    woe分析_信用评分模型中WOE、IV详解IV informaitonV IV 的概念 IV 全程是 informaitonV 中文意思是信息价值 或者信息量 在逻辑回归 决策树等模型方法构建分类模型时 经常需要对自变量进行筛选 比如我们有 200 个候选自变量 通常情况下 不会直接把 2000 个变量直接放到模型中去进行拟合训练 而是会用一些方法 从这 200 个自变量中挑选一些出来 放进模型 形成入模变量列表 那么如何挑选入模变呢 挑

    2026年3月16日
    0
  • 开始使用linggle

    开始使用linggle网址 http linggle com Linggle 搜索引擎是一个可用于英语写作的语法 句子工具 可帮助学习者分析更准确的英文写作建议 能够根据词性来推测短句和句子 可精准的分享出完整英文句子如何撰写 Linggle 是台湾学术团队研发的网路语言搜寻引擎 台湾清华大学 Linggle 系统是少数学界开发 规模逼近业界搜寻引擎规模的特例 2008 年新开发的 Linggle 系统 Linguis

    2026年3月20日
    2
  • Linux基础:systemctl和journalctl常用命令「建议收藏」

    Linux基础:systemctl和journalctl常用命令「建议收藏」systemctl介绍Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。重要:Systemctl接受服务(.service),挂载点(.mount),套接字(.socket)和设备(.device)作为单位。systemctl常用命令Systemd的版本systemd–versionsystemd和systemctl的二…

    2022年5月24日
    52
  • 无类路由计算方法_actin

    无类路由计算方法_actin给定一个包含 n 个点 m 条边的有向图,并给定每条边的容量和费用,边的容量非负。图中可能存在重边和自环,保证费用不会存在负环。求从 S 到 T 的最大流,以及在流量最大时的最小费用。输入格式第一行包含四个整数 n,m,S,T。接下来 m 行,每行三个整数 u,v,c,w,表示从点 u 到点 v 存在一条有向边,容量为 c,费用为 w。点的编号从 1 到 n。输出格式输出点 S 到点 T 的最大流和流量最大时的最小费用。如果从点 S 无法到达点 T 则输出 0 0。数据范围2≤n≤50

    2022年8月9日
    10

发表回复

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

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