我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息。使用方法如下:

Reflections reflections = new Reflections("my.project");
Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);

下面实例来说明如何使用的:

定义接口:

package test.reflection;

/**
* 类功能描述://TODO
*
* @author WangXueXing create at 19-5-4 下午10:16
* @version 1.0.0
*/
public interface Base {
void doSomeThing();
}

定义子类1:

package test.reflection;

/**
* 类功能描述://TODO
*
* @author WangXueXing create at 19-5-4 下午10:18
* @version 1.0.0
*/
public class SubClass1 implements Base{
@Override
public void doSomeThing() {
System.out.println("SubClass1");
}
}

定义子类2:

package test.reflection;

/**
* 类功能描述://TODO
*
* @author WangXueXing create at 19-5-4 下午10:18
* @version 1.0.0
*/
public class SubClass2 implements Base{
@Override
public void doSomeThing() {
System.out.println("SubClass2");
}
}

测试获取所有Base的子类信息:

package test.reflection;

import org.reflections.Reflections;

import java.util.Set;

/**
* 类功能描述://TODO
*
* @author WangXueXing create at 19-5-4 下午10:19
* @version 1.0.0
*/
public class Test {
public static void main(String[] args){
Reflections reflections = new Reflections("test.reflection");
Set<Class<? extends Base>> subTypes = reflections.getSubTypesOf(Base.class);
subTypes.forEach(x -> System.out.println(x));
}
}

结果输出如下:

class test.reflection.SubClass1
class test.reflection.SubClass2

如上如何获取所有子类信息。

其实Reflections还有其他很有用的功能,如下了解下:

一. Reflections的其他用法

使用默认的scanners,浏览url包含my.package的路径,包括以my.package开头的

Reflections reflections = new Reflections("my.package");

使用ConfigurationBuilder

new Reflections(new ConfigurationBuilder()
.setUrls(ClasspathHelper.forPackage("my.project.prefix"))
.setScanners(new SubTypesScanner(),
new TypeAnnotationsScanner().filterResultsBy(optionalFilter), ...),
.filterInputsBy(new FilterBuilder().includePackage("my.project.prefix"))
...);

然后方便的使用查询方法,这要根据具体scanners配置
SubTypesScanner

Set<Class<? extends Module>> modules =
reflections.getSubTypesOf(com.google.inject.Module.class);

TypeAnnotationsScanner

Set<Class<?>> singletons =
reflections.getTypesAnnotatedWith(javax.inject.Singleton.class);

ResourcesScanner

Set<String> properties =
reflections.getResources(Pattern.compile(".*\\.properties"));

MethodAnnotationsScanner

Set<Method> resources =
reflections.getMethodsAnnotatedWith(javax.ws.rs.Path.class);
Set<Constructor> injectables =
reflections.getConstructorsAnnotatedWith(javax.inject.Inject.class);

FieldAnnotationsScanner

Set<Field> ids =
reflections.getFieldsAnnotatedWith(javax.persistence.Id.class);

MethodParameterScanner

Set<Method> someMethods =
reflections.getMethodsMatchParams(long.class, int.class);
Set<Method> voidMethods =
reflections.getMethodsReturn(void.class);
Set<Method> pathParamMethods =
reflections.getMethodsWithAnyParamAnnotated(PathParam.class);

MethodParameterNamesScanner

List<String> parameterNames =
reflections.getMethodParamNames(Method.class)

MemberUsageScanner

Set<Member> usages =
reflections.getMethodUsages(Method.class)

如果没有配置scanner,默认使用SubTypesScannerTypeAnnotationsScanner
也可以配置Classloader,用来解析某些实时类
保证能够解析到url
git上的例子:https://github.com/ronmamo/reflections/tree/master/src/test/java/org/reflections

三. ReflectionUtils

ReflectionsUtils包含了一些方便的方法,形式类似*getAllXXX(type, withYYY)
比如

import static org.reflections.ReflectionUtils.*;

Set<Method> getters = getAllMethods(someClass,
withModifier(Modifier.PUBLIC), withPrefix("get"), withParametersCount(0)); //or
Set<Method> listMethodsFromCollectionToBoolean =
getAllMethods(List.class,
withParametersAssignableTo(Collection.class), withReturnType(boolean.class)); Set<Fields> fields = getAllFields(SomeClass.class, withAnnotation(annotation), withTypeAssignableTo(type));

四. ClasspathHelper

获取包、class、classloader的方法
使用maven可以很方便的集成到项目中,可以把浏览的元数据存储到xml/json文件中,下一次不必浏览,直接使用
在maven中,使用Reflections Maven plugin插件
其他用法

  • 并行查找url
  • 序列化查找为xml/json
  • 直接利用存储的元数据,快速load,不必再次scan
  • 存储模型实体为.java文件,可以通过静态方式引用types/fields/methods/annotation
  • 初始化srping的包浏览

五. 注解的例子

获取包中,带TaskOption注解的类,然后获取注解的task()

    Map<Class<? extends Task>, Class<?>> optionMap = new HashMap<>();
for (Class<?> clazz : reflections.getTypesAnnotatedWith(TaskOption.class)) {
TaskOption taskOption = clazz.getAnnotation(TaskOption.class);
if (taskOption == null) continue; // this shouldn't happen
optionMap.put(taskOption.task(), clazz);
}

Java 获取所有子类信息的更多相关文章

  1. java获取当前操作系统的信息

    java获取当前操作系统的信息 JavaOS虚拟机UnixEXT  从网上收集的一些关于java获取操作系统信息的方法,现在总结一下: 1获取本机的IP地址: private static Strin ...

  2. java获取天气预报的信息

    运行效果: 主要功能: 1,jsp页面输入省份和城市 根据条件获取当地的天气信息 2,java代码 利用第三方的省份和城市的路径地址 本工程主要实现java获取天气预报的信息步骤1,创建工程weath ...

  3. Java 获取到配置文件信息

    Java程序将数据库或者服务器IP写入到代码中,难免缺少灵活性. 如果写入到配置文件,部署到不通服务器上,只需要修改配置文 件即可. Java怎么读取配置文件 /** * 获取到配置文件信息 * @p ...

  4. java获取全部子类或接口的全部实现

    在JAVA中,获取一个类的全部父类是比较简单的,只需要通过反射(Class的getSuperclass()方法)即可.然而,如果想获得一个类的所有子类,或者获得实现某一个接口的所有实现类,相对比较麻烦 ...

  5. java获取类的信息

    关键技术剖析 1.java.lang.reflect包实现了java的反射机制,在使用反射机制时,需要导入该包. 2.Class类的forName方法能够根据类名加载类,获得类的Class对象. Cl ...

  6. Java获取电脑硬件信息

    package com.szht.gpy.util; import java.applet.Applet; import java.awt.Graphics; import java.io.Buffe ...

  7. Java获取系统相关信息System.getProperty()

    java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目 ...

  8. JAVA获取系统相关信息

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003596 获取JRE系统相关参数 java 通过S ...

  9. java获取来访者mac信息

    根据IP获取对应的Mac地址,支持win10+Linux package com.simonjia.util.other; /** * @Author: SimonHu * @Date: 2019/6 ...

随机推荐

  1. Activex在没有电子秤api的情况下获取串口数据

    大二做B/S架构的项目使用了安衡电子秤CHS-D+R和一款扫码枪,两个设备的串口使用一样,这款电子秤是相当的坑,没有开发的api,无奈只能自己开发Activex了,在B/S架构中进行引用Activex ...

  2. Python - MySQL 数据库连接 - PyMySQL 驱动 - 第二十五天

    序言 本文我们为大家介绍 Python3 使用 PyMySQL 连接数据库,并实现简单的增删改查. 什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务 ...

  3. Linux下java验证码不显示:Could not initialize class sun.awt.X11FontManager

    一.问题 javaweb项目,登录的时候有个图片验证码的功能.在Windows本地测试能够正常显示,部署到Linux上就不行了.报错如下: org.springframework.web.util.N ...

  4. apache-tomcat-7.0.94在Windows上启动时,控制台黑窗口出现乱码解决

    一.问题 二.解决 原因是tomcat日志编码的配置问题. 打开tomcat/conf/logging.properties配置文件. 把编码注释掉或者改为gbk就可以了. 参考:https://bl ...

  5. 怎么进入bios设置界面,电脑如何进入BIOS进行设置,怎么进入BIOS的方法集合

    怎么进入bios设置界面,电脑如何进入BIOS进行设置,怎么进入BIOS的方法集合 开机出现电脑商家图标时,按住F10键进入BIOS界面.进入BIOS界面一般都是开机后按<del,Esc,F1, ...

  6. Arduino leonardo+esp8266-01作服务端与APP进行数据通信

    esp8266-01调试 一.硬件设备 1.USB转TTL 2.esp8266-01 3.杜邦线 4.电脑 二.接线 ESP8266 TTL-USB VCC VCC(最好选择3.3V) CH_PD V ...

  7. elasticsearch 入门篇

    前言: 要论入门最好的文档,非elasticsearch权威指南和官方的开发文档莫属,我只是基于这两份文档,记录一些关键知识点和自己的理解. 我们为什么要用elasticsearch,或者说来解决什么 ...

  8. 英语chrismatite黄蜡石chrismatite单词

    黄蜡石chrismatite的原岩均为硅质岩,各种原岩受到构造变动.火山活动.热液作用等影响,产生复杂的物理和化学变化,包括重结晶.热变质等,导致矿物成分及结构构造的变化,后受构造变动的影响,岩石露出 ...

  9. python3匿名函数

    当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外, ...

  10. CoreData数据库搭建

    1.首先创建父类吧重用的代码写在里边 #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @inte ...