反射框架Reflections

举报
西魏陶渊明 发表于 2022/09/25 03:10:04 2022/09/25
【摘要】 Github (opens new window) # 一、简介 Reflections通过扫描classpath,索引元数据,并且允许在运行时查询这些元数据。 使用Reflections可以很轻松的获取以下元数据信息: 获取某个类型的全部子类 只要类型、构造器、方法,...

Github (opens new window)

# 一、简介

Reflections通过扫描classpath,索引元数据,并且允许在运行时查询这些元数据。

使用Reflections可以很轻松的获取以下元数据信息:

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

# 二、Maven依赖


    
  1. <dependency>
  2. <groupId>org.reflections</groupId>
  3. <artifactId>reflections</artifactId>
  4. <version>0.9.11</version>
  5. </dependency>
1 2 3 4 5

# 三、使用方法

# 3.1 实例化

指定要扫描的包名


    
  1. // 实例化Reflections,并指定要扫描的包名
  2. Reflections reflections = new Reflections("my.project");
  3. // 获取某个类的所有子类
  4. Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
  5. // 获取包含某个注解的所有类
  6. Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
1 2 3 4 5 6 7

指定要扫描的包名并添加过滤器

ConfigurationBuilder API (opens new window)


    
  1. Reflections reflections = new Reflections(
  2. new ConfigurationBuilder()
  3. .forPackage("com.my.project")
  4. .filterInputsBy(new FilterBuilder().includePackage("com.my.project")));
1 2 3 4

添加扫描器

Scanners API (opens new window)


    
  1. // scan package with specific scanners
  2. Reflections reflections = new Reflections(
  3. new ConfigurationBuilder()
  4. .forPackage("com.my.project")
  5. .filterInputsBy(new FilterBuilder().includePackage("com.my.project").excludePackage("com.my.project.exclude"))
  6. .setScanners(TypesAnnotated, MethodsAnnotated, MethodsReturn));
  7. // scan package with all standard scanners
  8. Reflections reflections = new Reflections("com.my.project", Scanners.values());
1 2 3 4 5 6 7 8 9

# 3.2 扫描子类


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

# 3.3 扫描注解


    
  1. //TypeAnnotationsScanner
  2. Set<Class<?>> singletons =
  3. reflections.getTypesAnnotatedWith(javax.inject.Singleton.class);
1 2 3

# 3.4 扫描资源


    
  1. //ResourcesScanner
  2. Set<String> properties =
  3. reflections.getResources(Pattern.compile(".*\\.properties"));
1 2 3

# 3.5 扫描方法、构造注解


    
  1. //MethodAnnotationsScanner
  2. Set<Method> resources =
  3. reflections.getMethodsAnnotatedWith(javax.ws.rs.Path.class);
  4. Set<Constructor> injectables =
  5. reflections.getConstructorsAnnotatedWith(javax.inject.Inject.class);
1 2 3 4 5

# 3.6 扫描字段注解


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

# 3.7 扫描方法参数


    
  1. //MethodParameterScanner
  2. Set<Method> someMethods =
  3. reflections.getMethodsMatchParams(long.class, int.class);
  4. Set<Method> voidMethods =
  5. reflections.getMethodsReturn(void.class);
  6. Set<Method> pathParamMethods =
  7. reflections.getMethodsWithAnyParamAnnotated(PathParam.class);
1 2 3 4 5 6 7

# 3.8 扫描方法参数名


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

# 3.9 扫描方法调用情况


    
  1. //MemberUsageScanner
  2. Set<Member> usages =
  3. reflections.getMethodUsages(Method.class)
1 2 3

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/125858145

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。