精华内容
下载资源
问答
  • Java 通过反射获取注解值
    千次阅读
    2019-04-22 10:43:02

    (1)定义一个注解

    package com.zyq.annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * 通用配置注解
     * @author zyq
     * @date 2019-04-22
     */
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Desc {
        String value ();
        String remark () default "";
    }
    

    (2)定义一个类,类的属性上使用该注解

    package com.zyq.consts;
    
    import com.zyq.annotation.Desc;
    
    /**
     * 用户状态
     * @author zyq
     * @date 2019-04-22
     */
    public class UserStatus {
    
        @Desc(value = "正常")
        public static int NORMAL = 1;
    
        @Desc(value = "非正常", remark="该状态用户不能登录")
        public static int ABNORMAL = 2;
    
    }
    

    (3)定义一个与注解属性对应的类

    package com.zyq.vo;
    
    public class FixedVo {
    
        public int key;
        public String value;
        public String remark;
    
        public int getKey() {
            return key;
        }
    
        public String getValue() {
            return value;
        }
    
        public String getRemark() {
            return remark;
        }
    
        public void setKey(int key) {
            this.key = key;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
        public void setRemark(String remark) {
            this.remark = remark;
        }
    
        @Override
        public String toString() {
            return "FixedVo [key=" + key + ", value=" + value + ", remark="
                    + remark + "]";
        }
    }
    

    (4)创建一个注解工具类,提供解析注解的方法

    package com.zyq.tools;
    
    import java.lang.reflect.Field;
    import java.util.Collections;
    import java.util.LinkedList;
    import java.util.List;
    
    import com.zyq.annotation.Desc;
    import com.zyq.vo.FixedVo;
    
    public class AnnotationTool {
    
        /**
         * 获取打了Desc注解的字典属性列表
         * @param t 类
         * @return 字典属性列表
         */
        public static <T> List<FixedVo> getFixedVoList(Class<T> c) {
            if (c == null) {
                return Collections.emptyList();
            }
            try {
                T cls = c.newInstance();
                Field[] fields = c.getDeclaredFields();
                List<FixedVo> fixedVoList = new LinkedList<FixedVo>();
                for (Field field : fields) {
                    Desc desc = field.getAnnotation(Desc.class);
                    if (desc != null) {
                        FixedVo vo = new FixedVo();
                        vo.setKey(field.getInt(cls));
                        vo.setValue(desc.value());
                        vo.setRemark(desc.remark());
                        fixedVoList.add(vo);
                    }
                }
                return fixedVoList;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return Collections.emptyList();
        }
    
    }
    

    (4)测试类代码

    package com.zyq.tools.test;
    
    import java.util.List;
    
    import org.junit.Test;
    
    import com.zyq.consts.UserStatus;
    import com.zyq.tools.AnnotationTool;
    import com.zyq.vo.FixedVo;
    
    public class AnnotationToolTest {
    
        @Test
        public void getFixedVoListTest(){
            List<FixedVo> voList = AnnotationTool.getFixedVoList(UserStatus.class);
            for (FixedVo vo : voList) {
                System.out.println(vo.toString());
            }
        }
    
    }
    

    (4)测试结果:

    FixedVo [key=1, value=正常, remark=]
    FixedVo [key=2, value=非正常, remark=该状态用户不能登录]

     

    更多相关内容
  • java 通过反射获取类上注解,方法上注解注解里的及方法参数,项目为maven项目。导入时记得选择maven项目
  • java反射获取注解上的参数

    千次阅读 2021-12-08 18:16:53
    此处用到了反射, 还有java.lang下的两个方法 java.lang.Package.isAnnotationPresent(Class<? extends Annotation> annotationClass) 如果指定类型的注释存在于此元素上,方法返回true j...

    场景

    最近写一个文档, 用到了一个导出类的属性释义, 但这些释义定义在导出类属性上的注解上, 如下

    几十个字段好几个类, 一个个敲是自然万万不可,复制也太慢, 最好是写个代码一锅端!

    方案

    此处用到了反射, 还有java.lang下的两个方法

    •  java.lang.Package.isAnnotationPresent(Class<? extends Annotation> annotationClass) 
      • 如果指定类型的注释存在于此元素上,  方法返回true
    • java.lang.Package.getAnnotation(Class< A > annotationClass) 
      • 如果是该类型的注释, 方法返回该元素的该类型的注释

    实例

    实体类TestExportVO

    
    import java.io.Serializable;
    import java.lang.reflect.Field;
    
    import cn.afterturn.easypoi.excel.annotation.Excel;
    import io.swagger.annotations.ApiModel;
    import lombok.Data;
    
    @Data
    @ApiModel(value = "TestExportVO")
    public class TestExportVO implements Serializable {
        private static final long serialVersionUID = 1L;
    
        /** 姓名 */
        @Excel(name = "姓名", width = 15)
        private String studentName;
    
        /** 身份证号 */
        @Excel(name = "身份证号", width = 20)
        private String identityId;
    
        /** 学号 */
        @Excel(name = "学号", width = 20)
        private String studentId;
    
        /** 出生日期 */
        @Excel(name = "出生日期", width = 15)
        private String birthday;
    
        // ......
    }

    获取注释上的内容 

        public static void main(String[] args) {
            // 获取类注解
            if(TestExportVO.class.isAnnotationPresent(ApiModel.class)){
                System.out.println(TestExportVO.class.getAnnotation(ApiModel.class).value());
            }
    
            // 获取类变量注解:
            Field[] fields = TestExportVO.class.getDeclaredFields();
            for (Field f : fields) {
                if(f.isAnnotationPresent(Excel.class)){
                    System.out.print(f.getAnnotation(Excel.class).name() + ",");
                }
            }
        }

    运行如下

     

    扩展

    获取方法上的注解

     

            // 获取方法注解:
            Method[] methods = TestExportVO.class.getDeclaredMethods();
            for (Method m : methods) {
                if(m.isAnnotationPresent(Excel.class)){
                    System.out.println(m.getAnnotation(Excel.class).name());
                }
            }

    获取方法参数上的注解

     

            // 获取方法参数注解:
            Method[] methods2 = TestExportVO.class.getDeclaredMethods();
            for (Method m : methods2) {
                // 获取方法的所有参数
                Parameter[] parameters = m.getParameters();
                for (Parameter p : parameters) {
                    // 判断是否存在注解
                    if(p.isAnnotationPresent(Excel.class)){
                        System.out.println(p.getAnnotation(Excel.class).name());
                    }
                }
            }

    展开全文
  • 主要介绍了java 注解annotation的使用以及反射如何获取注解的相关资料,需要的朋友可以参考下
  • 简单demo,导入即可运行。
  • 自定义注解和通过反射获取注解
  • 下面小编就为大家带来一篇浅谈Java自定义注解和运行时靠反射获取注解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录 这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码 1.首先需要自定义注解类 /** * 自定义方法注解 此时...

    由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录

    这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码

    1.首先需要自定义注解类

    /**
    * 自定义方法注解 此时用于定时器注解便于生成方法以及方法的作用
    * (获取定时器任务的方法以及名称)
    */
    @Documented
    @Target({ElementType.METHOD}) //注解应用类型(应用到方法的注解,还有类的可以自己试试)
    @Retention(RetentionPolicy.RUNTIME) // 注解的类型
    public @interface MethodInterface {
       //属性字段名称 默认空字符串
    String name() default "";
    }

    2.创建好自定方法类名就可以创建了
    public class TestThtread {
    public final Integer NUMBER = 100000;

    @MethodInterface(name = "方法注解1")
    public void test1(){

    System.out.println("方法体1");
    }
    @MethodInterface(name = "方法注解2")
    public void test2(){

    System.out.println("方法体2");
    }
    @MethodInterface(name = "方法注解3")
    public void test3(){

    System.out.println("方法体3");
    }
    }

    3.最后就是利用java反射机制获取了
    public static void testJava() {
    Class<?> printClass = null;
    //KeyValueDto是实体类方便返回也可以用map
    List<KeyValueDto> list = new ArrayList();
    try {
    //获取类名的包名地址
    printClass = Class.forName("com.lxp.demo.Schedules.TestThtread");
    //java反射机制获取所有方法名
    Method[] declaredMethods = printClass.getDeclaredMethods();
    //遍历循环方法并获取对应的注解名称
    for (Method declaredMethod : declaredMethods) {
    String isNotNullStr = "";
    // 判断是否方法上存在注解 MethodInterface
    boolean annotationPresent = declaredMethod.isAnnotationPresent(MethodInterface.class);
    if (annotationPresent) {
    // 获取自定义注解对象
    MethodInterface methodAnno = declaredMethod.getAnnotation(MethodInterface.class);
    // 根据对象获取注解值
    isNotNullStr = methodAnno.name();
    }
    list.add(new KeyValueDto(declaredMethod.getName(),isNotNullStr));
    }
    //排序(按照方法名称排序)
    Collections.sort(list);
    System.out.println(list.toString());
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    实体类 KeyValueDto
    public class KeyValueDto implements Comparable<KeyValueDto>{
    private String key;
    private String value;

    public KeyValueDto(String key, String value) {
    this.key = key;
    this.value = value;
    }

    public String getKey() {
    return key;
    }

    public void setKey(String key) {
    this.key = key;
    }

    public String getValue() {
    return value;
    }

    public void setValue(String value) {
    this.value = value;
    }

    @Override
    public int compareTo(KeyValueDto o) {
    return o.getKey().compareTo(this.key);
    }

    @Override
    public String toString() {
    return "{" +
    "key='" + key + '\'' +
    ", value='" + value + '\'' +
    '}';
    }
    }



    4.最后一步就是测试和结果了
    public static void main(String[] args) {
    testJava();
    }

    看完这个是不是感觉java反射机制很清晰,我就感觉很强大,虽然这个是冰山一角,但是这个也是花了点时间就分享一下,有兴趣可以留言讨论下更多的

     
     


    转载于:https://www.cnblogs.com/lxp-java/p/11040754.html

    展开全文
  • 首先来看看使用反射获取注解名: 只需在获取class后调用getAnnotation方法即可,如下 这里是获取JPA映射b表名,Table.class,使用下面这个可以获取表名 import javax.persistence.Table; annotation.name() 这里...
  • 首先自定义两个注解: 1、用于描述表名,只能用在类、接口、枚举上 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface TableName { String value(); } 2、用于描述列的信息,列名...

    首先自定义两个注解:
    1、用于描述表名,只能用在类、接口、枚举上

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TableName {
        String value();
    }
    

    2、用于描述列的信息,列名、数据类型、长度

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ColumnInfo {
        String columnName();
        String type();
        int length();
    }
    

    创建实体类

    //表名为PersonTable
    @TableName("PersonTable")
    public class Person {
    
    //设置三个字段的相关信息
        @ColumnInfo(columnName = "姓名",type = "varchar",length = 20)
        private String name;
        @ColumnInfo(columnName = "身份证号",type = "int",length = 5)
        private int id;
        @ColumnInfo(columnName = "年龄",type = "int",length = 3)
        private int age;
    }
    

    获取类上的注解,以及注解中的值:

    Class person= Person.class;
    //直接通过动态类的对象获取类上的注解
    Annotation[] annotations = person.getAnnotations();
    for (Annotation annotation : annotations) {
        System.out.println(annotation);
    }
    //获取注解中的值,注解也有Class类的对象
    TableName declaredAnnotation = (TableName) person.getDeclaredAnnotation(TableName.class);
    //获取注解中的值
    System.out.println(declaredAnnotation.value());
    

    在这里插入图片描述
    获取类中属性上的注解,以及注解中的值:

    Class person= Person.class;
    1、获取指定的属性 
    Field name = person.getDeclaredField("name");
    2、通过getAnnotation方法获取该属性上指定的注解,注意给的参数
    ColumnInfo annotation = name.getAnnotation(ColumnInfo.class);
    3、获取注解中的值
    System.out.print(annotation.columnName()+"  ");
    System.out.print(annotation.type()+"  ");
    System.out.print(annotation.length());
    

    在这里插入图片描述
    通过注解(保存数据库中列的信息)加上反射(解析注解中的信息)我们能获取数据库中列的信息,通过拼接成SQL语句就能够对数据库进行相关操作

    展开全文
  • 下面小编就为大家带来一篇Java 自定义注解及利用反射读取注解的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 1.先创建两个注解,一个作用于类,一个作用于属性 //类名的注解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @interface Tablelixv{ String value(); } //属性的注解 @Target(ElementType....
  • /** * 获取方法并赋值 * @param obj */ public void give(Object obj){ try { Class clas = obj.getClass(); Field [] fields = clas.getDeclaredFields(); for (Field
  • 自定义类注解package com.uno.ray; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; i...
  • 一、自定义注解1、字段注解import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java....
  • Java 自定义注解,反射获取注解

    千次阅读 2019-05-22 19:46:39
    自定义注解 import java.lang.annotation.*; @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ParamDesc { //描述 String desc() default ""; //默认值 St.....
  • 主要介绍了Java基于反射机制实现全部注解获取的方法,结合实例形式分析了java反射机制获取注解的具体实现方法与操作注意事项,需要的朋友可以参考下
  • import java.lang.reflect.Field; import java.util.Date; /** * Created by Liuxd on 2019/7/31. */ public class IBeanUtils { public static IFieldResult containFieldName(Object obj, String filedName, ...
  • 主要给大家介绍了关于Java利用反射如何查找使用指定注解的类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
  • 负责注解其他注解注解java的四个元注解: 1.@Target:描述注解的使用范围,即用在类、方法、变量,它的取值范围定义在ElementType 枚举中。 public enum ElementType { // 类、接口、枚举类 TYPE, // 成员...
  • 获取注解的属性,通过反射获取注解的属性。二、示例代码1、定义一个注解,用于给 全局变量 field 字段 赋值package com.haha.study.annotation.value;import java.lang.annotation.Documented;import java...
  • java通过反射获取对象的指定属性(包括私有属性和指定注解属性
  • 1、定义自定义注解类(类注解和字段注解): [java] view plain copy package com.uno.ray; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; ...
  • 可以利用反射获取注解中的,通过反射可以获取一个类的Class对象,通过该对象可以获取注解,获取到对应的注解后,就可以获取注解中的,具体代码实现如下: public class AnnotationDemo { public static void ...
  • 一、注解(Annotation) 1.什么是注解? 相信大家对注解应该并不陌生,在现在信息飞速发展的年代,各种优秀的框架或许都离不开注解的使用,像我们在实现接口一个方法时,也会有@Override注解注解说白了就是对程序...
  • 利用反射获取requestMapping注解的value,springMvc实现路径映射功能的逻辑
  • Java反射获取不到注解

    万次阅读 2021-04-26 08:53:00
    在CGlib动态代理的情况下 method.getAnnotation(PostMapping.class);...这样是获取不到注解的. 需要用Spring自带的工具类来获取: AnnotationUtils.findAnnotation(method, PostMapping.class);

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,979
精华内容 33,591
关键字:

java反射获取注解的值

java 订阅