Reflection

Reflections

Reflections 为java 提供了反射的封装好的业务逻辑
github地址:https://github.com/ronmamo/reflections


扫描指定路径包下的方法上是否包含注解, 方法 等等;

加入我们通过自定义的注解来描述一下信息, 那么我们如何来获取到这些注解的信息呢? 

简单的方法可以使用spring自带的一些方法例如: applicationContext.getBeansWithAnnotation(RestController.class);

加入没有spring的上下文的情况手写一个获取注解的业务就相对来说比较复杂一点了,那么github上面提供了一个开源的包Reflections

可以为我们来获取特定的方法 和注解提供了便利;
package com.example.study.util;

import org.reflections.Reflections;
import org.reflections.scanners.MethodAnnotationsScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import org.reflections.util.FilterBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Set;

/**
 * @author shenzm
 * @date 2019-9-5 14:50
 * @since 1.0
 */
public class AnnotationUtil {

    private static final Logger logger = LoggerFactory.getLogger(AnnotationUtil.class);

    public static void getAnnotations(String scanPackage) {
        try {


            Reflections reflections = new Reflections(new ConfigurationBuilder()
                    //设置扫描的包的路径
                    .setUrls(ClasspathHelper.forPackage(scanPackage))
                    //扫描器
                    .setScanners(new MethodAnnotationsScanner())
                    //启用并发的扫描, executor 执行任务
                    .useParallelExecutor()
                    //对多个多urls进行Predict过滤(了解lambda predict的作用的就和好理解了)
                    .filterInputsBy(new FilterBuilder().includePackage(scanPackage))
            );

            Set<Method> methods = reflections.getMethodsAnnotatedWith(RequestMapping.class);
            for (Method method : methods) {
                RequestMapping rm = method.getAnnotation(RequestMapping.class);
                if (null != rm) {
                    String value = rm.value()[0];
                    String[] produces = rm.produces().length == 0 ? new String[]{"application/json;charset=utf-8"} : rm.produces();
                    logger.info("请求的路径: " + value + " 响应格式:" + Arrays.toString(produces));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        getAnnotations("com.example.study.controller");
    }
}