Reflections框架,类扫描神器

一、 项目背景

我们的工程是一个很大的插件化架构的工程。实现某个接口或者带有特定注解的类,都视为一个插件。系统启动前,要在工程依赖的所有的jar包中,扫描指定接口或注解的全部子类,并做进一步的处理。

二、 Reflections框架简介

Reflections one-stop-shop object
Reflections scans your classpath, indexes the metadata, allows you to query it on runtime and may save and collect that information for many modules within your project.

Reflections是一个能提供一站式服务的对象。
它扫描工程的classpath,为元数据建索引,允许你运行时查询元数据信息。此外,他还能为你项目的lib库中所有的jar包保存和收集元数据。

1. 借助它能做什么?

  1. 获取某个类型的全部子类
  2. 只要类型、构造器、方法,字段上带有特定注解,便能获取带有这个注解的全部信息(类型、构造器、方法,字段)
  3. 获取所有能匹配某个正则表达式的资源
  4. 获取所有带有特定签名的方法,包括参数,参数注解,返回类型
  5. 获取所有方法的名字
  6. 获取代码里所有字段、方法名、构造器的使用

2. 相关资料

github地址 : https://github.com/ronmamo/reflections

javadoc地址 : http://ronmamo.github.io/reflections/index.html?org/reflections/Reflections.html

三、简单demo

获取所有Inputstream的子类,限定只扫包前缀为“java”的,也就是jdk自带的

package reflect;

import com.google.common.base.Stopwatch;
import org.reflections.Reflections;

import java.io.InputStream;
import java.util.Set;

/**
 * @date 2018/5/20
 **/
public class ReflectionTest {

    public static void main(String[] args) {
        Reflections                       reflections = new Reflections("java.");
        Stopwatch                         stopwatch   = Stopwatch.createStarted();
        Set> allTypes    = reflections.getSubTypesOf(InputStream.class);
        System.out.println(stopwatch.toString());
        for (Class type : allTypes) {
            System.out.println(type.getName());
        }
    }
}

程序输出


11.79 ms
java.util.jar.JarVerifier$VerifierStream
java.util.zip.GZIPInputStream
java.io.FileInputStream
java.io.SequenceInputStream
java.beans.ObjectInputStreamWithLoader
java.rmi.MarshalledObject$MarshalledObjectInputStream
java.net.SocketInputStream
java.io.ObjectInputStream$BlockDataInputStream
java.lang.UNIXProcess$DeferredCloseProcessPipeInputStream
java.util.jar.Manifest$FastInputStream
java.lang.UNIXProcess$ProcessPipeInputStream
java.io.BufferedInputStream
java.io.PipedInputStream
java.util.zip.ZipInputStream
java.util.zip.ZipFile$ZipFileInputStream
java.io.ByteArrayInputStream
java.util.zip.CheckedInputStream
java.util.zip.GZIPInputStream$1
java.util.zip.InflaterInputStream
java.security.DigestInputStream
java.util.Base64$DecInputStream
java.io.LineNumberInputStream
sun.rmi.server.MarshalInputStream
java.io.ObjectInputStream
java.io.FilterInputStream
java.io.StringBufferInputStream
java.util.zip.DeflaterInputStream
java.lang.ProcessBuilder$NullInputStream
java.io.ObjectInputStream$PeekInputStream
java.io.PushbackInputStream
java.util.jar.JarInputStream
java.lang.UNIXProcess$DeferredCloseInputStream
java.util.zip.ZipFile$ZipFileInflaterInputStream
java.nio.channels.Channels$2
java.io.DataInputStream

你可能感兴趣的:(Java框架)