反射工具—Reflections


prtyaa
prtyaa 2024-01-10 15:33:14 61479 赞同 0 反对 0
分类: 资源 标签: 运维
今天做项目的时候有一个需求,需要去指定包路径下找到自定义注解的Class, 虽然项目使用使用的springboot, 可以将这个Class放到IOC容器中,然后通过BeanFacotry根据指定注解获取出来,但实际上我并不需要将他们放到容器中,就是单纯的获取一下标注特定注解的Class做些处理。

后面发现了一个比较好用的反射框架: Reflections。使用Reflections可以很轻松的获取以下数据:

  • 获取某个类型的全部子类
  • 获取指定注解的类,方法,属性等等
  • 获取所有能匹配某个正则表达式的资源
  • 获取所有带有特定签名的方法,包括参数,参数注解,返回类型
  • 获取代码里所有字段、方法名、构造器的使用

大家可以去github上看看,它里面列举了很多常用的例子。我这里也是搬过来简单说下,当做自己的一个笔记。

首先要导入它的依赖。


    org.reflections
    reflections
    0.10.2

1. 简单使用

先定义一个接口和两个抽象类:

package com.qiuguan.demo.service;

public interface UserService {

    void login();
}


public class UserServiceImpl implements UserService {

    @MyAnnotation
    @Override
    public void login() {

    }
}

public class UserServiceExtImpl implements UserService {

    @MyAnnotation
    @Override
    public void login() {

    }
}

自定义一个注解:

package com.qiuguan.demo.anns;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface MyAnnotation {

}

自定义两个类:

package com.qiuguan.demo.bean;

public abstract class AbstractAnimal {

}


@MyAnnotation
public class Cat extends AbstractAnimal {

    private String name;
    
    @MyAnnotation
    public void eat() {
        
    }
}

进入正题:

import static org.reflections.scanners.Scanners.TypesAnnotated;

public class ReflectionTest {

    public static void main(String[] args) {

        //这里如果不指定扫描的包路径,那么它会根据类加载器把项目中的类路径以及jar包都会扫描,会比较慢,所以最好指定路径
        Reflections reflections = new Reflections("com.qiuguan.demo");


        //标注了该注解的所有类
        Set> classes = reflections.get(TypesAnnotated.of(MyAnnotation.class).asClass());
        classes.forEach(System.out::println);
    }
}

输出结果:class com.qiuguan.demo.bean.Cat

import static org.reflections.scanners.Scanners.*;

public class ReflectionTest {

    public static void main(String[] args) {

        /**
         * 这里如果不指定扫描的包路径,那么它会根据类加载器把项目中的类路径以及jar包都会扫描,会比较慢,所以最好指定路径
         * 参考 {@link Scanners } 类,配置不同的Scanner, 比如扫描类注解,方法注解,子类等等。
         */
        Reflections reflections = new Reflections(new ConfigurationBuilder()
                .forPackage("com.qiuguan.demo")
                //这里要和上面保持一致保持一致,不写也不行,不然输出结果不对。没有特殊要求,就用String参数的构造器
                .filterInputsBy(new FilterBuilder().includePackage("com.qiuguan.demo"))
                //包含包和排除包路径。写excludePackage前要先写includePackage,不然排除包不会生效
                //.filterInputsBy(new FilterBuilder().includePackage("com.qiuguan.demo").excludePackage("com.qiuguan.boot"))
                .setScanners(TypesAnnotated, Scanners.MethodsAnnotated, SubTypes, MethodsReturn)
        );


        System.out.println("=================== 获取标注该注解的所有类 =======================");
        Set> typesAnnotatedWith = reflections.get(TypesAnnotated.of(MyAnnotation.class).asClass());
        typesAnnotatedWith.forEach(System.out::println);

        System.out.println("=================== 获取标注该注解的所有方法 =======================");
        Set> returnsAnnotatedWith = reflections.get(MethodsReturn.of(void.class).asClass());
        returnsAnnotatedWith.forEach(System.out::println);
    }
}
00:14:16.193 [main] INFO org.reflections.Reflections - Reflections took 185 ms to scan 1 urls, producing 10 keys and 19 values
=================== 获取标注该注解的所有类 =======================
class com.qiuguan.demo.bean.Cat
=================== 获取标注该注解的所有方法 =======================
=================== 获取返回值是void的方法 =======================

2. ReflectionUtils

import static org.reflections.ReflectionUtils.*;
//获取某个类的所有父类
Set

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL0
粉丝 1 资源 1949 + 关注 私信
最近热门资源
银河麒麟桌面操作系统V10SP1-2403-update1版本中,通过“麒麟管家-设备管理-硬件信息-硬盘”查看硬盘类型时,显示的是HDD(机械硬盘),而实际上该笔记本的硬盘类型为SSD  81
以openkylin为例编译安装内核  77
分享解决宏碁电脑关机时自动重启的方法  73
统信uosboot区分未挂载导致更新备份失败  63
分享如何解决报错:归档 xxx.deb 对成员 control.tar.zst 使用了未知的压缩,放弃操作  63
统信uos安装mysql的实例参考  60
格之格打印机dp3300系列国产系统uos打印机驱动选择  57
在银河麒麟高级服务器操作系统V10SP3中,需要将默认shell类型修改为csh。  51
MySQL国产平替最佳选择---万里数据库(GreatDB)  45
分享在麒麟系统中权限异常的解决方法  2
最近下载排行榜
银河麒麟桌面操作系统V10SP1-2403-update1版本中,通过“麒麟管家-设备管理-硬件信息-硬盘”查看硬盘类型时,显示的是HDD(机械硬盘),而实际上该笔记本的硬盘类型为SSD 0
以openkylin为例编译安装内核 0
分享解决宏碁电脑关机时自动重启的方法 0
统信uosboot区分未挂载导致更新备份失败 0
分享如何解决报错:归档 xxx.deb 对成员 control.tar.zst 使用了未知的压缩,放弃操作 0
统信uos安装mysql的实例参考 0
格之格打印机dp3300系列国产系统uos打印机驱动选择 0
在银河麒麟高级服务器操作系统V10SP3中,需要将默认shell类型修改为csh。 0
MySQL国产平替最佳选择---万里数据库(GreatDB) 0
分享在麒麟系统中权限异常的解决方法 0
作者收入月榜
1

prtyaa 收益400.83元

2

zlj141319 收益237.91元

3

哆啦漫漫喵 收益231.52元

4

IT-feng 收益219.92元

5

1843880570 收益214.2元

6

风晓 收益208.24元

7

777 收益173.17元

8

Fhawking 收益106.6元

9

信创来了 收益106.03元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

添加我为好友,拉您入交流群!

请使用微信扫一扫!