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
对象可以是Field
, Method
或Class
,也可以是任何这些对象的强制转换(我们将其称为CFoM)。 如果x
符合已编译的表达式,则match()
方法将返回true
。
选择器表达式
该表达式是一个Java字符串。 可以与任何CFoM匹配的简单至true
。 同样, false
将不匹配任何内容。 到目前为止,微不足道。 表达式可以包含其他条件。 public
, private
volatile
等可以用于匹配具有任何修饰符的CFoM。 如果您在CFoM上使用诸如volatile
的东西而不能是volatile(类或方法),则将得到IllegalArgumentException。
对于课程,您可以具有以下条件:
interface
当类是接口primitive
时,它是一个基本类型annotation
时为注释anonymous
array
enum
member
local
也许您可能会查找成员类和本地类。 学习一点Java永远不会太晚。 在开发此工具之前,我不知道是否可以查询类是否是本地类。
这些条件很简单。 您也可以使用模式匹配。 如果编写extends ~ /regex/
,它将仅匹配扩展名称与正则表达式regex
匹配的类的类。 您还可以将name
, simpleName
和canonicalName
与正则表达式进行匹配。 如果我们的CFoM x
是一个方法或字段,则检查返回类型,除非是name
因为它们也有一个名字。
条件
有很多条件可以使用,这里我只列出一个子集。 包含所有单词的详细文档位于https://github.com/verhas/javageci/blob/master/FILTER_EXPRESSIONS.md
这是一个开胃菜:
protected
, package
, static
, public
, final
, synthetic
,
synchronized
, native
, strict
, default
, vararg
, implements
,
overrides
, void
, transient
, volatile
, abstract
表达结构
检查一件事情不会太有帮助。 并且还将方法compile()
的参数称为“表达式”表明存在更多内容。
您可以将条件组合成完整的逻辑表达式。 您可以创建一个选择器Selector.compile("final | volatile")
来匹配所有线程安全的字段,这些字段可以是final
或volatile
或两者都是(在Java中是不可能的,但是选择器表达式不会在意)。 您也可以说Selector.compile("public & final & static")
以仅匹配那些public
, final
和static
字段。 或者,您可以Selector.compile("!public & final & static")
来匹配final
和static
字段,这些字段是private
, protected
或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表达式优化反射_反射选择器表达式相关推荐
- python 表达式求值_简单算术表达式求值
本文主要探讨简单的数学算术表达式求值算法的原理和实现. 1. 约束 本文只是探讨简单的算术表达式的求值算法,为了将主要精力放在算法思想的探讨和实现上,避免陷入对其他不是直接相关的细节的过多思考,所以提 ...
- java lambda 反射_反射调用与Lambda表达式调用
想调用一个方法很容易,直接代码调用就行,这人人都会.其次呢,还可以使用反射.不过通过反射调用的性能会远远低于直接调用--至少从绝对时间上来看的确是这样.虽然这是个众所周知的现象,我们还是来写个程序来验 ...
- java hook 和反射_反射基本概念与Class(四):Hook技术动态编程
背景介绍 很多时候系统处于安全考虑,将很多东西对外隐藏,而有时我们偏偏又不得不去使用这些隐藏的东西.甚至,我们希望向系统中注入一些自己的代码,以提高程序的灵活性.刚好有这么一种特殊的回调模式,Hook ...
- 【More Effective C#】Lambda表达式优化
[More Effective C#]Lambda表达式优化 2010-10-19 08:09 by 空逸云, 2923 阅读, 38 评论, 收藏, 编辑 使用Lambda表达式将会造成Lambda ...
- mysql构造函数_MySQL行构造器表达式优化(Row Constructor Expression)
mysql 官方文档行构造器表达式优化(Row Constructor Expression Optimization)这一节里面,对行构造表达式及其优化进行了介绍,因为用的不多,也没太关注过.但是看 ...
- el表达式的语法_「手把手教python3接口自动化」「第三章」:Python3 语法
1 Python3 语法 1.1 基础语法 [编码] 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 当然你也可以为源码文件指定不同的编码. [标 ...
- lambda表达式可以用来声明_lambda表达式可以用来创建包含多个表达式的匿名函数...
[单选题]下面程序中语句print(i*j)一共执行了____次. for i in range(5): for j in range(2,5): print(i*j) [填空题]_____是目前比较 ...
- 当前方法的代码已经过优化,因此无法计算表达式的值
当前方法的代码已经过优化,因此无法计算表达式的值 /************************************************************************** ...
- python表达式中可以控制运算的优先顺序_在Python表达式中可以使用_______控制运算的优先顺序。...
[填空题]Python中的大部分对象均为不可变对象,例如___________________________等,_ __________________________________等则为可变对象 ...
最新文章
- R语言编写自定义分组统计函数(customize statistics function)可视化分组箱图并在X轴标签下方添加分组对应的统计值(样本数N、中位数median、四分位数的间距iqr)
- Emacs常用快捷键
- IDEA的GsonFormat插件--将json字符串直接实例化成类
- python2 dict 乱序_为什么我的python dict变得无序?
- recyclerview 分组_Android使用RecyclerView实现跨列分组
- 欢乐纪中A组周六赛【2019.3.23】
- 实验 使用 vivado zedboard GPIO 开关 开控制 LED
- java struts1_struts1.x
- 25.conda 下载安装与运用
- angular使用Md5加密
- java统计大串中小串的出现次数_统计大串中小串出现的次数
- 【车联网】车联网产业发展报告(2019)
- 【Elasticsearch】Elasticsearch之别名
- 华为secoclient提示“无法建立vpn链接,vpn服务器可能无法到达”
- matlabRC电路实验仿真
- 2022年最新京东滑块验证码破解思路(算法过验)
- mapreduce详细工作流程
- 卸载steam 桌面图标消失异常
- UE4莫名其妙崩溃的解决办法
- Bmob 萌新也能简易上手 之一 注册登录- *2020版 (有demo)
热门文章
- cf1512 G - Short Task
- H.Minimum-cost Flow
- CodeForces730E Award Ceremony(拓扑排序+结论)
- 选数游戏(ybtoj-二叉堆)
- 2021牛客OI赛前集训营-提高组(第五场)C-第K排列【dp】
- 欢乐纪中A组周六赛【2019.3.23】
- POJ2689-Prime Distance【质数,数论】
- 【并查集】打击犯罪(ssl 2342)
- 北京区域赛I题,Uva7676,A Boring Problem,前缀和差分
- 北方大学 ACM 多校训练赛 第十五场 买花