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表达式优化反射

lambda表达式优化反射_反射选择器表达式相关推荐

  1. python 表达式求值_简单算术表达式求值

    本文主要探讨简单的数学算术表达式求值算法的原理和实现. 1. 约束 本文只是探讨简单的算术表达式的求值算法,为了将主要精力放在算法思想的探讨和实现上,避免陷入对其他不是直接相关的细节的过多思考,所以提 ...

  2. java lambda 反射_反射调用与Lambda表达式调用

    想调用一个方法很容易,直接代码调用就行,这人人都会.其次呢,还可以使用反射.不过通过反射调用的性能会远远低于直接调用--至少从绝对时间上来看的确是这样.虽然这是个众所周知的现象,我们还是来写个程序来验 ...

  3. java hook 和反射_反射基本概念与Class(四):Hook技术动态编程

    背景介绍 很多时候系统处于安全考虑,将很多东西对外隐藏,而有时我们偏偏又不得不去使用这些隐藏的东西.甚至,我们希望向系统中注入一些自己的代码,以提高程序的灵活性.刚好有这么一种特殊的回调模式,Hook ...

  4. 【More Effective C#】Lambda表达式优化

    [More Effective C#]Lambda表达式优化 2010-10-19 08:09 by 空逸云, 2923 阅读, 38 评论, 收藏, 编辑 使用Lambda表达式将会造成Lambda ...

  5. mysql构造函数_MySQL行构造器表达式优化(Row Constructor Expression)

    mysql 官方文档行构造器表达式优化(Row Constructor Expression Optimization)这一节里面,对行构造表达式及其优化进行了介绍,因为用的不多,也没太关注过.但是看 ...

  6. el表达式的语法_「手把手教python3接口自动化」「第三章」:Python3 语法

    1 Python3 语法 1.1 基础语法 [编码] 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 当然你也可以为源码文件指定不同的编码. [标 ...

  7. lambda表达式可以用来声明_lambda表达式可以用来创建包含多个表达式的匿名函数...

    [单选题]下面程序中语句print(i*j)一共执行了____次. for i in range(5): for j in range(2,5): print(i*j) [填空题]_____是目前比较 ...

  8. 当前方法的代码已经过优化,因此无法计算表达式的值

    当前方法的代码已经过优化,因此无法计算表达式的值 /************************************************************************** ...

  9. python表达式中可以控制运算的优先顺序_在Python表达式中可以使用_______控制运算的优先顺序。...

    [填空题]Python中的大部分对象均为不可变对象,例如___________________________等,_ __________________________________等则为可变对象 ...

最新文章

  1. R语言编写自定义分组统计函数(customize statistics function)可视化分组箱图并在X轴标签下方添加分组对应的统计值(样本数N、中位数median、四分位数的间距iqr)
  2. Emacs常用快捷键
  3. IDEA的GsonFormat插件--将json字符串直接实例化成类
  4. python2 dict 乱序_为什么我的python dict变得无序?
  5. recyclerview 分组_Android使用RecyclerView实现跨列分组
  6. 欢乐纪中A组周六赛【2019.3.23】
  7. 实验 使用 vivado zedboard GPIO 开关 开控制 LED
  8. java struts1_struts1.x
  9. 25.conda 下载安装与运用
  10. angular使用Md5加密
  11. java统计大串中小串的出现次数_统计大串中小串出现的次数
  12. 【车联网】车联网产业发展报告(2019)
  13. 【Elasticsearch】Elasticsearch之别名
  14. 华为secoclient提示“无法建立vpn链接,vpn服务器可能无法到达”
  15. matlabRC电路实验仿真
  16. 2022年最新京东滑块验证码破解思路(算法过验)
  17. mapreduce详细工作流程
  18. 卸载steam 桌面图标消失异常
  19. UE4莫名其妙崩溃的解决办法
  20. Bmob 萌新也能简易上手 之一 注册登录- *2020版 (有demo)

热门文章

  1. cf1512 G - Short Task
  2. H.Minimum-cost Flow
  3. CodeForces730E Award Ceremony(拓扑排序+结论)
  4. 选数游戏(ybtoj-二叉堆)
  5. 2021牛客OI赛前集训营-提高组(第五场)C-第K排列【dp】
  6. 欢乐纪中A组周六赛【2019.3.23】
  7. POJ2689-Prime Distance【质数,数论】
  8. 【并查集】打击犯罪(ssl 2342)
  9. 北京区域赛I题,Uva7676,A Boring Problem,前缀和差分
  10. 北方大学 ACM 多校训练赛 第十五场 买花