我以前的博客(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. AngleSharp 实战(05)之遍历内部子元素(x)元素,尝试着获取元素的 Attr 和 InnerText

    直接贴代码了: using System; using System.Linq; using System.Threading.Tasks; using AngleSharp; using Angle ...

  2. 一个简单的利用 WebClient 异步下载的示例(四)

    接上一篇,我们继续优化它. 1. DownloadEntry 类 public class DownloadEntry { public string Url { get; set; } public ...

  3. Response.Write的alert换行问题

    Response.Write("<script> alert('恭喜 clientuser1注册成功!!!\\r\\n正在跳转到登录界面......');window.locat ...

  4. Yapi接口管理平台 本地部署 windows环境 -

    YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布.维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只 ...

  5. sql2008好看的字体

  6. 二十:职责链模式详解(类似于spring的hangler处理请求)

    定义:为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. “看这个定义,就是将一堆可以处理请求的对象连 ...

  7. flink Transitive Closure算法,实现寻找新的可达路径

    flink 使用Transitive Closure算法实现可达路径查找. 1.Transitive Closure是翻译闭包传递?我觉得直译不准确,意译应该是传递特性直至特性关闭,也符合本例中传递路 ...

  8. Jmeter对服务器进行压力测试

    一.插件准备 下载地址:https://jmeter-plugins.org/downloads/all/ 1.下载插件管理: 2.将管理插件放到jmeter/../ext文件夹中 3.在插件管理中搜 ...

  9. php session的理解【转】

    目录 1.什么是session? 2.Session常见函数及用法? ● 如何删除session? ● SESSION安全: Session跨页传递问题: 1.什么是session?   Sessio ...

  10. java Random类生成随机数

    封装一个方法: import java.util.Random; public class RandomUtil { /** * nextInt(num) 产生[0 ~ (num-1)]的随机数, 闭 ...