滑动拼图验证码操作步骤:_拼图项目:一个不完整的难题

滑动拼图验证码操作步骤:

马克·雷因霍尔德(Mark Reinhold)最近提议延迟Java 9,以花更多的时间完成项目Jigsaw,这是即将发布的版本的主要功能。 虽然这个决定肯定会使Java的厄运论者重回舞台,但我个人感到很轻松,并且认为这是一个很好且必要的决定。 Java 9功能完成的里程碑当前设置为12月10日 ,禁止在该日期之后引入新功能 。 但是, 从 Jigsaw项目的早期访问版本来看,Java的模块系统似乎尚未为该开发阶段做好准备。

在最新的Java发布周期中,项目Jigsaw的延迟已成为一种习惯 。 一定不能将其误解为无能,而只能作为一种指示,说明向Java引入模块有多困难,而Java目前对于真正的模块化来说是陌生的。 最初,Java的模块系统是在2008年提出的,以包含在Java 7中。但是直到今天,拼图的实现始终比预期的要困难得多。 在几次停职甚至是暂时的放弃之后,Java的管理员肯定会承受最终成功的压力。 很高兴看到这种压力并没有促使Java团队急于发布。

在本文中,我尝试总结一下Jigsaw项目的状态,并在Jigsaw邮件列表中进行了公开讨论 。 我写这篇文章是为了对当前的讨论做出贡献,并希望让更多的人参与到正在进行的开发过程中。 我无意淡化Oracle所做的艰苦工作。 我在明确声明这一点是为了避免在隐藏sun.misc.Unsafe之后对拼图进行了相当激动的讨论之后,引起了误解。

模块化反射

究竟是什么使Jigsaw项目如此困难? 如今,可见性修饰符是封装类范围的最接近的近似值。 Package-privacy可以用作其包装类型的不完美保留。 但是对于跨越多个程序包的内部API的更复杂的应用程序,可见性修饰符不足,因此需要真正的模块。 使用项目Jigsaw,可以真正封装类,这使得即使某些类被声明为公共类,某些代码也无法使用它们。 但是,基于所有类在运行时始终可用的假设下构建的Java程序可能需要进行根本性的更改。

对于最终用户应用程序的开发人员而言,此更改的根本性可能不如Java库和框架的维护人员。 库通常在编译过程中不知道其用户代码。 为了克服此限制,库可以回退到使用反射。 这样,用于依赖项注入的容器(例如Spring)可以实例化应用程序的bean实例,而框架在编译时并不知道bean类型。 为了实例化此类对象,容器只需将其工作延迟到运行时,直到它扫描应用程序的类路径并发现现在可见的bean类型。 对于这些类型中的任何一种,框架都将定位一个构造函数,该构造函数在解析所有注入的依赖项后会进行反射性调用。

一长串Java框架使用与反射配对的运行时发现。 但是在模块化环境中,如果不解决模块边界问题,就无法再运行以前的运行时分辨率。 使用项目Jigsaw,Java运行时断言每个模块仅访问在访问模块的描述符中声明为依赖项的模块。 此外,导入的模块必须将相关的类导出到其访问器。 依赖项注入容器的模块化版本无法将任何用户模块声明为依赖项,因此禁止进行反射访问。 实例化未导入的类时,这将导致运行时错误。

为了克服此限制,Jigsaw项目添加了一个新的API,该API允许在运行时包括其他模块依赖性。 使用此API并添加所有用户模块后,模块化的依赖项注入容器现在可以继续实例化在编译时不知道的bean类型。

但是这个新的API真的可以解决问题吗? 从纯粹的功能角度来看,此附加API允许迁移库以保留其功能,即使将其重新包装为模块也是如此。 但是不幸的是,模块边界的运行时强制要求在使用大多数反射代码之前先进行仪式舞蹈。 在调用方法之前,调用者需要始终确保相应的模块已经是调用者的依赖项。 如果框架忘记添加此检查,则会在编译期间抛出运行时错误而不会被发现。

由于许多库和框架都过度使用了反射,因此可访问性的这种变化不太可能改善运行时封装。 即使安全管理器会限制框架添加运行时模块依赖性,但强制执行此类边界可能会破坏大多数现有应用程序。 更现实的是,大多数违反模块边界的行为并不表示真正的错误,而是由代码迁移不当引起的。 同时,如果大多数框架抢占了对大多数用户模块的访问权限,则运行时限制不可能改善封装。

当模块对自己的类型使用反射时,此要求当然不适用,但是在实践中这种反射的使用非常少见,并且可以通过使用多态来代替。 在我眼中,在使用反射时强制执行模块边界与它的主要用例相抵触,并使本来就不容易的反射API更加难以使用。

模块化资源

除了这个限制,目前还不清楚依赖注入容器将如何发现它应该实例化的类。 在非模块化应用程序中,框架可以例如期望类路径上存在给定名称的文件。 然后,此文件用作描述如何发现用户代码的入口点。 通常,通过从类加载器请求命名资源来获取此文件。 对于项目Jigsaw,当所需的资源也封装在模块的边界内时,这将不再可能。 据我所知,资源封装的最终状态尚未完全确定。 但是,在尝试当前的早期访问版本时,无法访问外部模块的资源。

当然,拼图项目的当前草案中也解决了这个问题。 为了克服模块边界,已授予Java 预先存在的ServiceLoader类超能力。 为了使特定的类可用于其他模块,模块描述符提供了一种特殊的语法,该语法允许通过模块边界泄漏某些类。 应用此语法,框架模块声明它提供了某种服务。 然后,用户库声明框架可以访问同一服务的实现。 在运行时,框架模块使用服务加载器API查找其服务的任何实现。 这可以用作在运行时发现其他模块的方式,并且可以替代资源发现。

乍看之下,这种解决方案似乎很优雅,但我仍然对此提议表示怀疑。 服务加载程序API的使用非常简单,但同时,其功能也非常有限。 此外,很少有人将其改编成自己的代码,这可以视为其范围有限的指示。 不幸的是,只有时间能证明此API是否能够充分容纳所有用例。 同时,可以将单个Java类与Java运行时紧密地联系在一起,从而几乎不可能弃用和替换服务加载程序API。 在Java的历史背景下,已经讲述了许多看起来不错但又变酸的想法,我发现创建这样一个神奇的中心很容易成为现实,它很容易成为实现瓶颈。

最后,还不清楚如何在模块化应用程序中公开资源。 尽管Jigsaw不会破坏任何二进制兼容性,但从以前一直返回值的ClassLoader::getResource调用返回null可能只是将应用程序埋在成堆的null指针异常之下。 例如,代码操纵工具需要一种方法来定位类文件,这些类文件现在已经封装起来,这至少会阻碍它们的采用过程。

可选依赖项

服务加载器API无法容纳的另一个用例是可选依赖项的声明。 在许多情况下,可选的依赖项不被认为是一种好习惯,但实际上,如果可以将依赖项组合成大量排列,它们提供了一种便捷的方法。

例如,如果特定依赖项可用,则库可能能够提供更好的性能。 否则,它将退回到另一个不太理想的选择。 为了使用可选的依赖关系,需要库根据其特定的API进行编译。 但是,如果此API在运行时不可用,则库需要确保永不执行可选代码,并退回到可用的默认值。 这样的可选依赖关系无法在模块化环境中表示,即使从未使用过依赖关系,该环境也可以在应用程序启动时验证任何声明的模块依赖关系。

可选依赖项的一个特殊用例是可选注释包。 今天,Java运行时将批注视为可选的元数据。 这意味着,如果类加载器无法定位注释的类型,则Java运行时将仅忽略所关注的注释,而不是抛出NoClassDefFoundError 。 例如, FindBugs应用程序提供了一个注释包,用于在用户发现所讨论的代码为假阳性后抑制潜在的错误。 在应用程序的常规运行期间,不需要特定于FindBugs的注释,因此它们不包含在应用程序包中。 但是,在运行FindBugs时,该实用程序会显式添加注释包,以使注释可见。 在拼图项目中,这不再可能。 仅当模块声明对注释包的依赖性时,注释类型才可用。 如果以后在运行时缺少此依存关系,则尽管注释不相关,也会引发错误。

非模块化

当然,不将框架捆绑为Java 9中的模块是避免所有讨论的限制的最简单方法。 Java运行时将任何未模块化的jar文件视为类加载器的所谓未命名模块的一部分 。 这个未命名的模块定义了对正在运行的应用程序中存在的所有其他模块的隐式依赖性,并将其所有程序包导出到任何其他模块。 当混合模块化和非模块化代码时,这可以作为备用。 由于未命名模块的隐式导入和导出,所有未迁移的代码应继续像以前一样运行。

虽然这种选择退出可能是沉重反射框架的最佳解决方案,但缓慢采用项目Jigsaw确实也使模块系统的目的无法实现。 由于时间的缺乏是大多数开源项目的主要限制,因此很可能会出现这种结果。 此外,许多开源开发人员都必须将其库编译为旧版Java。 由于模块化和非模块化代码的运行时行为不同,框架将需要维护两个分支,以便能够使用Java 9 API遍历模块化捆绑包中的模块边界。 许多开源开发人员不太可能花时间来使用这种混合解决方案。

代码检测

在Java中,反射方法访问不是库与未知用户代码进行交互的唯一方法。 使用工具API ,可以重新定义类以包含其他方法调用。 例如,这通常用于实现方法级别的安全性或收集代码指标。

在检测代码时,通常会在类加载器加载Java类的类文件之前立即对其进行更改。 由于通常在紧接类加载之前应用类转换,因此当前无法预先更改模块图,因为未加载的类的模块是未知的。 如果检测代码在首次使用之前无法访问已加载的类,则可能会导致无法解决的冲突无法解决。

摘要

软件估算很困难,我们所有人都倾向于低估应用程序的复杂性。 Jigsaw项目对Java应用程序的运行时行为进行了根本性的更改,将发布推迟到彻底评估所有可能性是完全合理的。 当前,悬而未决的问题太多了,这是延迟发布日期的不错选择。

我希望模块边界完全不由运行时强制执行,而是保留为编译器构造。 尽管存在一些缺陷,Java平台已经实现了泛型类型的编译时擦除,并且该解决方案运行良好。 如果没有运行时强制实施,则在JVM上采用动态语言的模块也将是可选的,因为与Java中相同的模块化形式可能没有意义。 最后,我认为当前严格的运行时封装形式试图解决一个不存在的问题。 在使用Java多年之后,我很少遇到无意间使用内部API引起严重问题的情况。 相比之下,我记得在很多情况下滥用本应为私有的API可以解决我无法解决的问题。 同时,Jigsaw仍无法解决Java中缺少模块的其他症状(通常称为jar hell) ,Jigsaw不能区分模块的不同版本。

最后,我认为向后兼容性的适用范围超出了二进制级别。 实际上,二进制不兼容通常比行为更改更容易处理。 在这种情况下,Java多年来成就斐然。 因此,方法合同应与二进制兼容性一样受到高度重视。 尽管项目Jigsaw从技术上讲不会通过提供未命名的模块来破坏方法契约,但是模块化基于其绑定对代码行为进行了微妙的更改。 我认为,这将使经验丰富的Java开发人员和新手都感到困惑,并导致重新出现运行时错误。

这就是为什么我发现强制运行时模块边界的价格与其提供的好处相比过高的原因。 OSGi是一个具有版本控制功能的运行时模块系统,适用于确实需要模块化的用户。 作为一个很大的好处,OSGi在虚拟机之上实现,因此不会影响VM行为。 另外,我认为Jigsaw可以为库提供一种规范的方式,使其在有意义的情况下选择退出运行时约束,例如对于大量反射的库。

翻译自: https://www.javacodegeeks.com/2015/12/project-jigsaw-incomplete-puzzle.html

滑动拼图验证码操作步骤:

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

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

相关文章

document中输出html字符串流,HTML DOMDocument从段落后面的标签中获取字符串

我想解析html文档。我需要h2之后所有p的内容。要解析的html :(示例)Lorem ipsumLorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridic…

arcgis adf数据_使用ADF列表视图的主从数据

arcgis adf数据从UI角度来看,最近ADF Faces 表组件不再被认为很酷。 对于显示数据集合, 列表视图今天应该很酷。 这并不意味着我们根本不应该使用af:table 。 在某些情况下(经常是:)),表比列表视图更适合。…

jmeter添加html,Jmeter 报告可视化 —— 配置生成测试报告仪表板,Jmeter + Jenkins 自动化构建生成 HTML 报告...

目录一、jmeter报告仪表板相关信息二、文件修改说明三、jmeter.properties文件配置四、user.properties文件配置五、新建jtl报告目录六、复制jmeter.properties文件并重命名七、写批处理bat文件八、准备jmeter测试计划脚本九、本地调试bat文件十、Jenkins自动化构建一、jmeter报…

gradle java_Java EE,Gradle和集成测试

gradle java在过去的几年中,Apache Maven已成为Java和Java EE项目的事实上的构建工具。 但是从两年前开始, Gradle便获得了越来越多的用户。 在我之前的文章( http://www.lordofthejars.com/2015/10/gradle-and-java-ee.html )之后…

javafx 内存占用_JavaFX:TouchGesture内存泄漏?

javafx 内存占用在我的一个项目中,最近几天我在与内存泄漏作斗争(是……“耦合”),我得出的结论是可能存在与触摸/滚动手势有关的问题。 在下面的示例中,我有两个按钮。 第一个创建具有一千行的列表视图,第…

手机单选按钮 html5,@html剃刀单选按钮mvc5(@html razor radio buttons mvc5)

这里是我的视图模型public class UserResponseModel{public string QuestionId { get; set;}public string QuestionText { get; set; }public bool IsChecked { get; set; }}所以&#xff0c;对于这个复选框精美作品for (var i 0; i < Model.UserResponses.Count; i){Html…

cucumber jvm_用Cucumber JVM编写BDD测试

cucumber jvmCucumber JVM是编写BDD测试的出色工具。在本文中&#xff0c;我想对Cucumber JVM的BDD进行介绍。 让我们开始吧… 什么是BDD&#xff1f; 简而言之&#xff0c;BDD试图解决“通过示例理解需求”的问题 BDD工具 有许多可用于BDD的工具&#xff0c;有趣的是&#…

计算机网络英文介绍,计算机网络英文自我介绍

计算机网络英文自我介绍It’s my pleasure to introduce myself to you here. My name is XX, Icome from XX which is a beautiful city. And I am a candidate forthe position of Sales Representative. 公务员面试自我介绍I attended Nantong University in 2003. My major…

模拟模型学习 几何布朗运动_Java的几何布朗运动

模拟模型学习 几何布朗运动维纳过程是一个连续时间的随机过程&#xff0c;以纪念诺伯特维纳。 通常用于用随机成分表示噪音或财务状况。 可以计算几何布朗运动以可视化某些界限&#xff08;以分位数表示&#xff09;以暗示绝对范围。 为了进行计算&#xff0c;需要以下参数&am…

计算机网络基础 第4章 龚娟,计算机网络基础 人民邮电 龚娟 第4章习题答案

1&#xff0e;关于IPv4地址的说法&#xff0c;错误的是( C )。A&#xff0e;IP地址是由网络地址和主机地址两部分组成 B&#xff0e;网络中的每台主机分配了唯一的IP地址 C&#xff0e;IP地址只有三类&#xff1a;A&#xff0c;B&#xff0c;CD&#xff0e;随着网络主机的增多&…

动态调整线程池_调整线程池的重要性

动态调整线程池无论您是否知道&#xff0c;您的Java Web应用程序很可能都使用线程池来处理传入的请求。 这是许多人忽略的实现细节&#xff0c;但是迟早您需要了解如何使用该池以及如何为您的应用程序正确调整池。 本文旨在说明线程模型&#xff0c;线程池是什么以及正确配置线…

java系统架构师有的特质_Java中特质模式的定义

java系统架构师有的特质在本文中&#xff0c;我将介绍特征的概念&#xff0c;并为您提供一个具体示例&#xff0c;说明如何在Java中使用它们以减少对象设计中的冗余。 我将首先提出一个虚构的案例&#xff0c;其中可以使用特征来减少重复&#xff0c;然后以使用Java 8的特征模式…

html快速排序,快速排序.html

Titlevar arr2 [13, 4, 35, 67, 86, 24, 86, 34, 76];function quickSort(arr) {//如果数组<1,则直接返回if (arr.length < 1) {return arr;}var pivotIndex arr[arr.length - 1];//找基准&#xff0c;并把基准从原数组删除// var pivotarr.splice(pivotIndex,1)[0];//…

tdd java_Java TDD简介–第2部分

tdd java再次问好&#xff01; 在上一篇博客文章中&#xff0c;我在没有紧密引用Java的情况下总体上解释了TDD理论 &#xff0c;但是在这一部分中&#xff0c;我们开始进行TDD实践。 我们的目标是遍历TDD的所有阶段&#xff1a;从需求分析到测试代码的重构。 我们将在具有Java&…

计算机怎么没有桌面文件夹名称大全,你的电脑文件总是找不到?是时候学习文件夹分类整理了...

我们常常说做好办公整理&#xff0c;我们工作起来才更有效率&#xff1b;此处的办公整理不单单是对办公桌整理整齐&#xff0c;电脑里面的文件也需要定期整理&#xff0c;你有没有发现常常找一个文件的时候却总是找不到&#xff1f;那么此时就应该学习文件夹分类整理了&#xf…

selenide_使用Selenide进行有效的UI测试

selenide等待奇迹 圣诞节是奇迹的时刻。 在新的一年的前夕&#xff0c;我们都会制定下一个计划。 我们希望所有问题都将在最后一年消失&#xff0c;在来年出现奇迹。 每个Java开发人员都梦想着奇迹&#xff0c;使他成为世界上最有效的Java开发人员。 我想向你展示这样的奇迹…

计算机无法维修技术鉴定,计算机维修工技能鉴定(初级)剖析..pdf

计算机(微机)维修工初级理论知识复习题一、单项选择1、液晶显示器画面出现闪动的现象&#xff0c;原因可能是 ( C )。A 、数据线与显卡接口接触不良 B、操作系统有问题C 、显示器与主板不兼容 D、以上都不正确2、职业道德内涵是从事一定职业的人们在职业活动中应该遵循的&#…

实践与反思_在行动中反思的实践

实践与反思在上一篇文章中 &#xff0c;我解释了最基本的敏捷实践是反思。 在本文中&#xff0c;我概述了组织&#xff0c;团队和人员如何在行动中运用反思的示例。 回顾反思 回顾是功能强大的工具&#xff0c;整个团队都可以使用它们来反思其当前的工作实践&#xff0c;以了解…

win10无法更改计算机设置,Win10“无法保存ip设置,请检查一个或多个设置并重试”的解决方法...

近期有网友想要在Win10系统中手动设置本机IP地址&#xff0c;但是填写完毕之后却提示了“无法保存ip设置,请检查一个或多个设置并重试”&#xff0c;那么遇到这个问题&#xff0c;我们要如何解决呢&#xff1f;下面装机之家分享一下Win10“无法保存ip设置,请检查一个或多个设置…

24段魔尺拼图指南_拼图项目动手指南

24段魔尺拼图指南Jigsaw项目将把模块化引入Java平台&#xff0c;根据原始计划&#xff0c;它将在12月10日完成功能。 所以我们在这里&#xff0c;但拼图在哪里&#xff1f; 在过去的六个月中肯定发生了很多事情&#xff1a; 原型问世 &#xff0c;内部API的迫在眉睫的删除引起…