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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10个常用python标准库_【循序渐进学Python】11.常用标准库

安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间。这里是一些常用标准库的简单说明。更多的标准库的说明,可以参考Python文档 sys 模块 sys模块能够访问与Python解释器紧密联系的变量和函数…

Sublime Text安装格式化xml的插件

参见:https://www.cnblogs.com/sxdcgaq8080/p/7682593.html

maven原型_创建自定义Maven原型

maven原型Maven原型是项目模板,可以帮助我们根据其类型快速创建maven入门项目 。 这是一个不费吹灰之力地引导Maven项目的好工具。 我们可以使用多种原型。 一些流行的原型包括– maven-archetype-quickstart , maven-archetype-webapp , ma…

Maven的单元测试插件maven-surefire-plugin详解

文章目录pom.xml 的配置(注意事项,非常重要)测试案例执行测试命令surefire 插件配置pom.xml 的配置(注意事项,非常重要) 1.必须引入 maven-surefire-plugin 插件,否则无法使用 Maven 的测试功能…

mysql启动命令 windows_Windows下Nginx的启动停止等基本操作命令详解

在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动、停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍。1、启动:C:serverginx-1.0.2>start nginx或C:serverginx-1.0.2>ngin…

警告提示:No archetype found in remote catalog. Archetype not found in any catalog

IDEA 使用 archetype(原型/模板/骨架)创建 Maven 项目时, 最后提示: No archetype found in remote catalog. Defaulting to internal catalog Archetype not found in any catalog. Falling back to central repository. Add a…

python存数据到excel_python爬取的数据--保存数据到excel

在这里用到的是xlwt import xlwt 如果还未安装此模块,可以执行下面的命令安装: pip install xlwt 接下来就是将数据列表存储到excel当中: def save_to_excel(): try: workbook xlwt.Workbook(encodingutf-8) sheet workbook.add_sheet(taob…

vm 安装jdk1.8_JDK 13:VM.events已添加到jcmd

vm 安装jdk1.8CSR( 兼容性和规范审查 ) JDK-8224601 [“提供VM.events诊断命令”]从JDK 13 Early Access Build #24 (日期为2019/6/6 )开始在JDK 13中实现,并通过增强功能JDK- 8224600 [“提供VM.events命令…

macos big sur正式版_苹果macOS Big Sur正式版发布

苹果macOS Big Sur正式版发布:支持M1原生运行iOS应用苹果macOS Big Sur正式发布并开放下载,版本号为macOS 11.0.1(20B29)苹果近期刚发布了搭载M1芯片的Mac mini、MacBook Air和MacBook Pro新机型,预装了全新的macOS Big Sur苹果表示&#xff…

Maven如何生成可执行的jar文件

参考1:https://juejin.cn/post/6844903622430425095 参考2:http://xxgblog.com/2015/08/07/maven-create-executable-jar/ 参考3:https://www.cnblogs.com/justinzhang/p/4975727.html 参考4:https://www.cnblogs.com/hafiz/p/653…

java中qrcode_如何在Java中使用QRGen创建QRCode

java中qrcode在我以前的一篇文章中 ,我们了解了如何使用Zxing Java库创建QRCode及其等效的SVG。 Zxing库不再得到积极维护,为此,Zxing库周围有一个名为QRGen的包装,该包装提供了更高级别的API和用于生成QR代码的构建器语法。 在本…

java list有序还是无序_最详细的Java学习点知识脑图,从基础到进阶,看完还有啥你不懂的...

欢迎关注专栏《Java架构筑基》——专注于Java技术的研究与分享!Java架构筑基​zhuanlan.zhihu.comJava架构筑基——专注于Java技术的研究与分享!后续文章将首发此专栏!欢迎各位Java工程师朋友投稿和关注# 链接 Java程序员福利"常用资料分…

Maven的构件坐标(GAV)

groupld 定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联。譬如在 googlecode 上建立了一个名为 myapp 的项目,那么 groupld 就应该是 com.googlecode.myapp,如果你的公司是 htlwk,有一个项目为qpw,那…

rails jquery_Spring与Rails的jQuery UJS

rails jquery我一直想尝试一下是否可以在Spring Boot项目中使用Rails的jQuery UJS 。 jquery-ujs中的UJS代表简洁的JavaScript 。 我非常喜欢UJS如何将事件处理程序连接到标记有HTML5 data-*属性的合格DOM元素。 我发现自己希望看到更多在Spring Boot Web应用程序中使用的这种方…

python读word文档doc公文标题_python – 从word doc中提取标题文本

我试图从MS Word文档(.docx文件)中的标题(任何级别)中提取文本.目前我正在尝试使用python-docx来解决,但不幸的是我仍然无法弄清楚它是否在阅读之后是否可行(也许我错了). 我试图在线寻找解决方案,但没有发现我的任务特定.如果有人可以在这里指导我,那将是很棒的. 解决方法: 基…

序列化和反序列化的学习

文章目录序列化构造方法方法使用步骤反序列化构造方法方法使用步骤序列化 把内存中的对象以流的方式写入到文件中,这叫序列化,也叫“写对象” 使用 ObjectOutputStream 写入对象中的数据,这个流叫对象字节输出流,也叫对象的序列化…

java开发展望怎么写_Java开发趋势:2019年展望

java开发展望怎么写在这篇文章中,我们将发表一篇有关2019年Java开发趋势的综合文章。您是否知道Java自上世纪问世以来,现在已在100亿个设备上运行 ? 它是数十年来最受欢迎的编码语言,但是在最近几个月中,Java经历了一些…

dml语句包括哪些_MySQL数据操作(DML)语句,入门掌握这些足够了

DML是(Data Manipulation Languages)数据定义语言的缩写主要包括表记录的插入insert、更新update、删除select插入记录insert into table(field1,field2,...fieldn) values(value1,value2,...value)如:向表 emp 中插入以下记录:---------------------------| ename …

Servlet 的实例对象

Servlet 实例是由 Servlet 容器自动创建,也可以说是由 Web Server 创建的。 当请求到达服务器的时候,或者在 web.xml 中配置了 init 方法的时候,容器就会自动创建 Servlet 实例。 如果在 web.xml 中配置了 init 方法,那么启动服…

java 手动装箱拆箱对象_将旧对象装箱可自动关闭

java 手动装箱拆箱对象从Java 7开始,我们可以使用try-with-resources并自动关闭任何实现Autocloseable接口的对象。 如果资源是 Autocloseable 。 一些类需要一些总结,但不是Autocloseable 。 这些主要是某些遗留框架中的旧类,仍然妨碍我们前…