Java反射工具包reflections

Wesley13
• 阅读 676

1. 简介

reflections是一个Java反射工具包,使用它可以非常方便的获取一下字段或者方法。

2. maven

<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.12</version>
</dependency>

3. 配置

最简单的配置,就是直接指定扫描包:

Reflections reflections = new Reflections("java.util");

当然,也可以:

@Test
public void config(){
    ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
    //扫描vip.mycollege.jdk.reflect包
    Collection<URL> scannerPkg = ClasspathHelper.forPackage("vip.mycollege.jdk.reflect");

    SubTypesScanner subTypesScanner = new SubTypesScanner();

    //注解扫描
    TypeAnnotationsScanner typeAnnotationsScanner = new TypeAnnotationsScanner();

    FilterBuilder filter = new FilterBuilder()
            .includePackage("vip.mycollege.jdk.reflect")//注解扫描包
            .excludePackage("vip.mycollege.jdk.reflect.thirdpart");//注解扫描扫描排除包
    typeAnnotationsScanner.filterResultsBy(filter);

    ConfigurationBuilder configuration = configurationBuilder
            .setUrls(scannerPkg)
            .setScanners(subTypesScanner, typeAnnotationsScanner);

    Reflections reflections = new Reflections(configuration);
}

4. 通过类型扫描

@Test
public void newInstance(){
    Reflections reflections = new Reflections("java.util");
    //获取List及其子类
    Set<Class<? extends List>> listImpls = reflections.getSubTypesOf(List.class);
    listImpls.forEach(System.out::println);
}

5. 通过注解扫描

@Test
public void methodAnnotationsScanner(){
    Reflections reflections = new Reflections(SCAN_PKG);
    //方法上有Deprecated注解
    Set<Method> resources = reflections.getMethodsAnnotatedWith(Deprecated.class);
    //有PostConstruct注解的构造方法
    Set<Constructor> injectables = reflections.getConstructorsAnnotatedWith(PostConstruct.class);
}

@Test
public void FieldAnnotationsScanner(){
    //指定包下有Nonnegative的字段
    Reflections reflections = new Reflections(SCAN_PKG);
    Set<Field> ids = reflections.getFieldsAnnotatedWith(Nonnegative.class);
}

6. 方法相关

@Test
public void methodParameterScanner(){
    Reflections reflections = new Reflections(SCAN_PKG);
    //参数类型是long和int
    Set<Method> someMethods = reflections.getMethodsMatchParams(long.class, int.class);
    //参数返回值是void
    Set<Method> voidMethods = reflections.getMethodsReturn(void.class);
    //任何参数上有注解Nullable
    Set<Method> pathParamMethods = reflections.getMethodsWithAnyParamAnnotated(Nullable.class);

    for(Method method : someMethods) {
        //获取方法参数的名称
        List<String> parameterNames = reflections.getMethodParamNames(method);
        parameterNames.forEach(System.out::println);
    }
}

7. 工具类

@Test
public void reflectionUtils(){
    //必须是public方法
    Predicate<Method> publicPredicate = ReflectionUtils.withModifier(Modifier.PUBLIC);
    //有get前缀
    Predicate<Method> getPredicate = ReflectionUtils.withPrefix("get");
    //参数个数为0
    Predicate<Member> paramPredicate = ReflectionUtils.withParametersCount(0);
    Set<Method> methods = ReflectionUtils.getAllMethods(LinkedList.class, publicPredicate, getPredicate, paramPredicate);
    methods.forEach(method -> System.out.println(method.getName()));

    System.out.println("---------------");
    //参数必须是Collection及其子类
    Predicate<Member> paramsPredicate = ReflectionUtils.withParametersAssignableTo(Collection.class);
    //返回类型是boolean
    Predicate<Method> returnPredicate = ReflectionUtils.withReturnType(boolean.class);
    methods = ReflectionUtils.getAllMethods(LinkedList.class, paramsPredicate, returnPredicate);
    methods.forEach(method -> System.out.println(method.getName()));

    System.out.println("---------------");
    //字段有注解Native
    Predicate<Field> annotationPredicate = ReflectionUtils.withAnnotation(Native.class);
    //字段类型是int及其子类
    Predicate<Field> typeAssignablePredicate = ReflectionUtils.withTypeAssignableTo(int.class);
    Set<Field> fields = ReflectionUtils.getAllFields(Integer.class, annotationPredicate, typeAssignablePredicate);
//        Set<Field> fields = ReflectionUtils.getAllFields(Integer.class, annotationPredicate);
//        Set<Field> fields = ReflectionUtils.getAllFields(Integer.class, typeAssignablePredicate);
    fields.forEach(field -> System.out.println(field.getName()));
}

8. 资料文档

Github

点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java中的反射和代理
  Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制。java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的耦合性。这些都是java的基础知识,要想成为一名合格的程序猿,必须掌握!Java反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知
Wesley13 Wesley13
3年前
java面试(反射)05
1.什么是反射JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取类信息以及动态调用对象内容就称为java语言的反射机制。2.反射的作用在运行时判断任意一个对象所属的
lzy lzy
3年前
RPC框架手撕之路---java反射以及动态代理机制
在上一篇文章中,我们提到了,RPC框架所需要的java基础,第一点就是java的动态代理机制,动态代理机制的基础是反射,无论是在实际编程或者是面试时,都是java知识的重中之重。java反射:定义:在运行状态中,对于任意一个类,都能够知道这一个类的所有属性和方法,对于任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息以及动态调用类方法
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
3年前
Apache Commons工具集类库简单说明和使用
1.2.简介ApacheCommons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html BeanUtils CommonsBeanUtils提供对Java反射和自省API的包装Betw
Wesley13 Wesley13
3年前
Java反射技术概述
1.什么是Java反射?  就是正在运行,动态获取这个类的所有信息2.反射机制的作用  a.反编译:.class.java  b.通过反射机制,访问Java对象的属性,方法,构造方法等3.反射机制的应用场景  Jdbc加载驱动  SpringIOC实现  Java框架4.创建对象的两种方式  a.直
Wesley13 Wesley13
3年前
Java重点基础:反射机制
一、什么是反射?Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。二、反射的三种方式
Wesley13 Wesley13
3年前
Java反射机制及适用场景
什么是Java反射机制?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为Java的反射机制。反射的适用场景是什么?1.当你做一个软件可以安装插件的功能,你连插件的类型名称都不知道,你怎么实例化这个对象呢
京东云开发者 京东云开发者
5个月前
深入理解java反射机制及应用 | 京东物流技术团队
因为最近项目中经常有java反射的使用,而其中的IOC、动态代理用到了反射,因此趁这个机会来总结一下关于Java反射的一些知识,复习一下。本篇基于JDK1.8。java反射机制是什么反射原理Java反射机制(JavaReflection)是Java的特征之