lambda表达式优化反射_反射选择器表达式

lambda表达式优化反射

Java :: Geci是一个在单元测试期间运行的代码生成器。 如果生成的代码适合源代码的实际版本,则测试不会失败。 如果需要进行任何修改,则测试将修改源代码并失败。 例如,存在一个需要setter和getter的新字段,然后访问器生成器将生成新的setter和getter,然后失败。 如果没有新字段,那么生成的代码就是已经存在的代码,没有理由触摸源代码:启动生成器的测试成功完成。

因为Java :: Geci生成器在运行时作为测试运行,并且因为它们需要访问为其生成代码的Java代码结构,所以Java反射是这些生成器的关键。

为了帮助代码生成器执行任务, javageci-tools模块中提供了许多支持方法。

 com.javax0.geci  javageci-tools  1.1.1 

在本文中,我将在此模块中编写一个类: Selector ,可以帮助您基于逻辑表达式选择字段,方法或类。

介绍

javax0.geci.tools.reflection.Selector有点像正则表达式类Pattern 。 您可以创建一个调用静态方法compile(String expression)的实例。 在实例上,您可以调用match(Object x) ,其中x对象可以是FieldMethodClass ,也可以是任何这些对象的强制转换(我们将其称为CFoM)。 如果x符合已编译的表达式,则match()方法将返回true

选择器表达式

该表达式是一个Java字符串。 可以与任何CFoM匹配的简单至true 。 同样, false将不匹配任何内容。 到目前为止,微不足道。 表达式可以包含其他条件。 publicprivate volatile等可以用于匹配具有任何修饰符的CFoM。 如果您在CFoM上使用诸如volatile的东西而不能是volatile(类或方法),则将得到IllegalArgumentException。

对于课程,您可以具有以下条件:

  • interface当类是接口
  • primitive时,它是一个基本类型
  • annotation时为注释
  • anonymous
  • array
  • enum
  • member
  • local

也许您可能会查找成员类和本地类。 学习一点Java永远不会太晚。 在开发此工具之前,我不知道是否可以查询类是否是本地类。

这些条件很简单。 您也可以使用模式匹配。 如果编写extends ~ /regex/ ,它将仅匹配扩展名称与正则表达式regex匹配的类的类。 您还可以将namesimpleNamecanonicalName与正则表达式进行匹配。 如果我们的CFoM x是一个方法或字段,则检查返回类型,除非是name因为它们也有一个名字。

条件

有很多条件可以使用,这里我只列出一个子集。 包含所有单词的详细文档位于https://github.com/verhas/javageci/blob/master/FILTER_EXPRESSIONS.md

这是一个开胃菜:

protectedpackagestaticpublicfinalsynthetic
synchronizednativestrictdefaultvarargimplements
overridesvoidtransientvolatileabstract

表达结构

检查一件事情不会太有帮助。 并且还将方法compile()的参数称为“表达式”表明存在更多内容。

您可以将条件组合成完整的逻辑表达式。 您可以创建一个选择器Selector.compile("final | volatile")来匹配所有线程安全的字段,这些字段可以是finalvolatile或两者都是(在Java中是不可能的,但是选择器表达式不会在意)。 您也可以说Selector.compile("public & final & static")以仅匹配那些publicfinalstatic字段。 或者,您可以Selector.compile("!public & final & static")来匹配finalstatic字段,这些字段是privateprotected或package private,也称为“ not public”。 您还可以应用括号,并使用括号来构建相当复杂的逻辑表达式。

该用法可以是任何严重依赖反射的应用程序。 在Java :: Geci中,该表达式可以在任何为该方法或类的字段生成一些代码的生成filter参数中使用。 在这种情况下, filter可以选择需要代码生成的字段或方法。 例如,在访问器生成filter的情况下, filter的默认值为true :为所有字段生成设置器和获取器。 如果只需要专用字段的设置方法和获取方法,则可以指定filter="private" 。 如果您还想排除最终字段,则可以编写`filter =”!final&private”。 在这种情况下,您将无法获得最终字段的吸气剂。 (默认情况下根本不会为最终字段生成设置程序。生成器很聪明。)

使用流,非常容易编写表达式,例如

 Arrays.stream(TestSelector.class.getDeclaredFields())  .filter(Selector.compile( "private & primitive" .filter(Selector.compile( "private & primitive" )::match)  .collect(Collectors.toSet()); 

它将返回私有和原始的字段集。 请注意,在这种情况下,您会有一些选择器编译开销(尽管对于流来说只有一次),并且在某些情况下,性能可能不可接受。

实验一下,看看它是否适合您的需求。

我只是忘了补充:您还可以在运行时调用selector(String,Function)和/或selectorRe(String,Function)方法来扩展选择器。

翻译自: https://www.javacodegeeks.com/2019/06/reflection-selector-expression.html

lambda表达式优化反射

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值