如何获取包下所有类中的注解的值(java工具类)

获取包下所有类中注解的值

作用:

这个工具类主要的作用就是获取类中的注解的值。

应用场景:

做权限的时候获取@RequestMapping();的值,自动添加到数据库中。

/**
   * getRequestMappingValue方法描述:
   * 作者:thh
   * 日期:2016年7月18日 下午5:41:00
   * 异常对象:@param packageName
   * 异常对象:@return
*/
    public static List<String> getRequestMappingValue(String packageName) {
    GetAnnotationValueUtil getAnnotationValueUtil = new GetAnnotationValueUtil();
         //第一个class类的集合
        List<Class<?>> classes = new ArrayList<Class<?>>();
        //是否循环迭代
        boolean recursive = true;
        //获取包的名字 并进行替换
        String packageDirName = packageName.replace('.', '/');
        //定义一个枚举的集合 并进行循环来处理这个目录下的文件
        Enumeration<URL> dirs;
        try {
            //读取指定package下的所有class
            dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
            while (dirs.hasMoreElements()){
                URL url = dirs.nextElement();
                //得到协议的名称
                String protocol = url.getProtocol();
                //判断是否以文件的形式保存在服务器上
                if ("file".equals(protocol)) {
                    //获取包的物理路径
                    String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
                    //以文件的方式扫描整个包下的文件 并添加到集合中
                    findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        List<String> stringList = new ArrayList<String>();
        for (Class<?> clazz : classes) {
            //循环获取所有的类
            Class<?> c = clazz;
            //获取类的所有方法
            Method[] methods = c.getMethods();
            for (Method method : methods) {
                //获取RequestMapping注解
                RequestMapping annotation = method.getAnnotation(RequestMapping.class);
                if (annotation != null) {
                    //获取注解的value值
                    String[] value = annotation.value();
                    for (String string : value) {
                        //放入List集合
                        stringList.add(string);
                    }
                }
            }
        }
        return stringList;
    }
    /**
     * findAndAddClassesInPackageByFile方法描述:
     * 作者:thh
     * 日期:2016年7月18日 下午5:41:12
     * 异常对象:@param packageName
     * 异常对象:@param packagePath
     * 异常对象:@param recursive
     * 异常对象:@param classes
     */
    public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive, List<Class<?>> classes){
        //获取此包的目录 建立一个File
        File dir = new File(packagePath);
        //如果不存在或者 也不是目录就直接返回
        if (!dir.exists() || !dir.isDirectory()) {
            return;
        }
        //如果存在 就获取包下的所有文件 包括目录
        File[] dirfiles = dir.listFiles(new FileFilter() {
              //自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)
              public boolean accept(File file) {
                return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));
              }
        });
        //循环所有文件
        for (File file : dirfiles) {
            //如果是目录 则继续扫描
            if (file.isDirectory()) {
                findAndAddClassesInPackageByFile(packageName + "." + file.getName(),
                                      file.getAbsolutePath(),
                                      recursive,
                                      classes);
            }
            else {
                //如果是java类文件 去掉后面的.class 只留下类名
                String className = file.getName().substring(0, file.getName().length() - 6);
                try {
                    //添加到集合中去
                    classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + "." + className));
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }

java 类,变量,方法上注解值的获取

首先定义三个注解类, 分别适用于类,成员变量, 方法

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface LeiMode {
 public int value() default 1;
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FiledMode {
 public int value() default 1;
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TreahMode {
 public int value() default 1;
}

然后,定义一个类,使用了注解

@LeiMode(5)
public class AnnotationDemo {
 @FiledMode(10)
 private int itest;

 @TreahMode()
 private void test(){}
}

1.获取类上的注解值

LeiMode annotation = AnnotationDemo.class.getAnnotation(LeiMode.class);
System.out.println(annotation.value());

2.获取所有变量,并获取指定方法上的注解信息

Field[] fields = AnnotationDemo.class.getDeclaredFields();
  Field field = null;
  for(Field f : fields){
   if(f.getName().equals("itest")){
    field = f;
    break;
   }
  }
  FiledMode annotation = field.getAnnotation(FiledMode.class);
  System.out.println(annotation.value());

3.获取指定变量上的注解信息

Field field = AnnotationDemo.class.getDeclaredField("itest");
  FiledMode annotation = field.getAnnotation(FiledMode.class);
  System.out.println(annotation.value());

4.获取所有方法,并获取指定方法上的注解信息

Method[] methods = AnnotationDemo.class.getDeclaredMethods(); //可以获取私有方法和公有方法, getMethods() 获取公有方法
  Method meth = null;
  for(Method method : methods){
   if(method.getName().equals("test")){
    meth = method;
    break;
   }
  }
  Annotation annotation = meth.getAnnotations()[0];
  TreahMode mode = (TreahMode) annotation;
  System.out.println(mode.value());

5.获取指定方法上的注解信息

Method method = AnnotationDemo.class.getDeclaredMethod("test", null);//可以获取私有方法和公有方法
  System.out.println(method);
  Annotation[] annotations = method.getAnnotations();
  Annotation annotation = annotations[0];
  System.out.println(annotation);

  TreahMode mode = (TreahMode) annotation;
  System.out.println(mode.value());

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java之Spring注解开发案例详解

    在Spring4之后,要使用注解开发,必须要保证aop的包导入了 使用注解需要导入context约束,增加注解的支持! <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&

  • java中反射和注解的简单使用方法

    目录 什么反射? Java反射机制提供的功能 反射相关的主要API Class 类 获取Class 类的实例( 四种方法) 哪些类型可以有Class 对象? 演示Class类的常用方法 有了Class对象,能做什么? 调用运行时类的指定结构 1. 调用指定方法 关于setAccessible 调用Class对象的newInstance()方法 综合案例: 注解 什么是注解? 常见的Annotation JDK 中的元注解 自定义 Annotation 最后通过反射获取注解信息: 总结 什么反射?

  • Java-Java5.0注解全面解读

    概述 Java5.0注解可以看做Javadoc和Xdoclet标签的延伸和发展,在Java5.0中可以自定义这些标签,并通过Java语言的反射机制获取类中标注的注解,完成特定的功能. 注解是代码的附属信息,它遵循一个基本的原则:注解不能直接干扰程序代码的运行,无论增加或者删除注解,代码都能正常运行. Java语言解释器会忽略这些注解,而由第三方工具负责对注解进行处理. 第三方工具可以利用代码中的注解间接控制程序代码的运行,它们通过Java反射机制读取注解的信息,并根据这些信息更改目标程序的逻辑.

  • 一篇文章带你入门java注解

    目录 注解 什么是注解 内置注解 元注解 自定义注解 实例 总结 注解 什么是注解 Annotation是从JDK5.0开始引入的新技术 Annotation的作用: 1.不是程序本身,可以对程序做出解释(这一点和注释(comment)没什么区别) 2.可以被其他程序(比如:编译器等)读取 Annotation的格式: ​ 注解是以"@注释名"在代码中存在的,还可以添加一些参数值,例如: ​ @SuppressWarnings(value="unchecked")

  • Java中Lombok @Value注解导致的variable not been initialized问题

    目录 背景 解决 背景 想要修改一个POJO类,在其中增加一个字段,但是增加以后就开始报错: 该类已经存在一个构造函数,为了不破坏该类原来的使用方式,于是重新写了一个构造方法,之前的构造函数未改动. 该类被Lombok的@Value注解修饰 解决 报错信息显示,变量未被初始化.于是主要排查是否有被初始化. 在重写的构造方法中,我已经对该变量进行了初始化. 不明所以,开始找不同,这个类中,唯一不熟悉的就是@Value注解,于是查看注解中的注释: /** * Generates a lot of c

  • 如何获取包下所有类中的注解的值(java工具类)

    获取包下所有类中注解的值 作用: 这个工具类主要的作用就是获取类中的注解的值. 应用场景: 做权限的时候获取@RequestMapping();的值,自动添加到数据库中. /** * getRequestMappingValue方法描述: * 作者:thh * 日期:2016年7月18日 下午5:41:00 * 异常对象:@param packageName * 异常对象:@return */ public static List<String> getRequestMappingValue(

  • JavaScript实现获取select下拉框中第一个值的方法

    本文实例讲述了JavaScript实现获取select下拉框中第一个值的方法.分享给大家供大家参考,具体如下: 1.说明 获取select下拉框中的第一个值 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="

  • java反射获取包下所有类的操作

    我就废话不多说了,大家还是直接看代码吧~ public static void main(String[] args) { try { // 获取包名下所有类 Set<Class<?>> classes = getClasses("com"); for(Class c:classes){ // 打印有RestController 的类 if(c.isAnnotationPresent(RestController.class)){ System.out.prin

  • jQuery获取table下某一行某一列的值实现代码

    jQuery获取table下某一行某一列的值实现代码 最近需要获取到某个table下每一行某一列的值,用jQuery做了一会儿,过程如下,仅供参考: <div class="div"> <table name="info"><tr><td>lily<span>okok</span></td></tr><tr><td>18</td><

  • Android开发中超好用的正则表达式工具类RegexUtil完整实例

    本文实例讲述了Android开发中超好用的正则表达式工具类RegexUtil.分享给大家供大家参考,具体如下: /*********************************************** * 正则表达式工具 * * @author chen.lin * @version 1.0 ************************************************/ public class RegexUtil { /** * 车牌号码Pattern */ pub

  • 16 个有用的的Java工具类(小结)

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. org.apache.commons.io.IOUtils closeQuietly:关闭一个IO流.socket.或者selector且不抛出异常,通常放在finally块 toString:转换IO流. Uri. byte[]为String copy:IO流数据复制,从输入流写到输出流中,最大支

  • Java工具类之@RequestMapping注解

    一.前言 问题阐述:在某一场景下,我们的代码在 Service 实现相同,但却在 Controller 层访问时却希望不同的前缀可以访问.如下 :/say/hello.我们这里希望在不借助任何外部服务的情况下 通过 /a/say/hello 和 /b/say/hello 都可以访问到该接口,同时不想在 Controller 中写两个方法. @RestController @RequestMapping("say") public class SayController { @Autow

  • 利用Java工具类Hutool实现验证码校验功能

    目录 Hutool工具类介绍 Hutool实现验证码生成 测试验证码生成 其他样式的验证码 第一篇是纯利用现有JDK提供的绘图类(ImageIO)类制作,这个过程比较复杂且需要了解ImageIO类. 这一篇文章是利用Hutool工具类来实现的,该工具类已经封装验证码所需的相关类等,使用起来较为简单和方便. Hutool工具类介绍 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”.

  • Java工具类DateUtils实例详解

    本文实例为大家分享了Java工具类DateUtils的具体代码,供大家参考,具体内容如下 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 描述:公共日期工具类 */ public class DateUtils { public static String DATE_FORMAT = "yyyy-M

  • android自动生成dimens适配文件的图文教程详解(无需Java工具类)

    在编写ui界面时因为手机分辨率大小不同,所以展现出来的效果也是不同的,这个时候就需要考虑适配器,让根据手机分辨率自动适配相应尺寸来展示界面,可以提高用户的体验感. 1.首先安装插件ScreenMatch,安装成功之后android studio会提示重启 2.在res->values下创建一个dimens文件,将以下代码复制进去.如果不创建这个文件一下操作会不成功导致项目重启. <dimen name="common_margin">@dimen/dp_15</

随机推荐