如何判断无法到达目标的拼图_拼图项目的动机和目标

如何判断无法到达目标的拼图

几周前,我写了一篇关于Jigsaw项目可能如何破坏现有代码的文章 。 那么我们得到什么回报呢? 让我们看一下项目解决的痛点及其在Java 9中解决问题的目标。

系列

这篇文章是正在进行的有关拼图项目系列的一部分。 按照推荐的顺序(不同于发布顺序),它们是:

  • 动机和目标
  • 核心概念和功能(即将推出)
  • 如何破坏您的代码
  • 历史,结构和当前状态(即将发生)
  • 动手指南(即将在EA版本包含JSR 376的情况下发布 )

相应的标记列出了有关该主题的更多文章。

总览

在查看项目目标之前,我们将首先介绍激发创建拼图项目的痛点。

主要资源包括JSR 376和Java 9和Beyond ,由Mark Reinhold(Oracle Java平台组首席架构师)在EclipseCon 2015上发表。

痛点

Jigsaw项目旨在解决几个难题。

JAR /类路径地狱

很多人都写过有关类路径地狱和JAR地狱的文章 ,因此无需重复全部。

当运行库解决依赖关系的方式与开发人员认为的不同时,就会出现此问题。 例如,这可能导致运行版本错误的库。 寻找造成这种情况的原因可能非常令人不快(因此,乐观的说法)。

发生这种情况的原因是Java运行时加载类的方式。 该机制很脆弱(例如,取决于顺序),可能很复杂(例如,使用多个嵌套的类加载器),因此很容易出错。 此外,运行时无法分析需要哪些类,因此只有在运行时才能发现未实现的依赖项。

通常也不可能满足对同一库的不同版本的依赖。

跨封装的弱封装

Java的可见性修饰符非常适合在同一包中的类之间实现封装。 但是跨程序包边界只有一种可见性: public

由于类装入器将所有装入的程序包折叠成一个大泥球,因此所有其他类都可以看到所有公共类。 因此,无法创建在整个JAR中可见但不在其外部可见的功能。

这使得正确地模块化系统非常困难。 如果模块的不同部分(例如,系统的库或子项目)需要某些功能,但在模块外部不可见,则实现此功能的唯一方法是将它们全部放入一个包中(因此,能见度可以使用)。 这有效地删除了代码以前可能拥有的任何结构。

手动安全

跨软件包边界的弱封装的直接后果是,与安全相关的功能将暴露给在同一环境中运行的所有代码。 这意味着恶意代码可以访问关键功能,从而可能使其绕过安全措施。

从Java 1.1开始,这已被黑客阻止:在每个代码路径上都将java.lang.SecurityManager.checkPackageAccess调用到与安全相关的代码中,并检查是否允许访问。 或更准确地说:应该在每个这样的路径上调用它。 忘记这些调用会导致一些漏洞,这些漏洞过去困扰着Java。

启动表现

Java运行时加载当前所需的类并及时编译经常使用的类需要一段时间。

原因之一是,类加载对类路径上的所有JAR执行线性扫描。 同样,识别所有出现的特定注释需要检查类路径上的所有类。

刚性Java运行时

在Java 8之前,无法安装JRE的子集。 所有Java安装都支持XML,SQL和Swing,而许多用例根本不需要。

尽管这与中型计算设备(例如台式PC或笔记本电脑)无关紧要,但对于最小的设备(如路由器,电视盒,汽车以及所有其他使用Java的角落和缝隙),显然很重要。 在当前的容器化趋势下,它也可能与服务器相关,减少图像的占用空间将降低成本。

Java 8带来了紧凑的概要文件 ,这些概要文件定义了Java SE的三个子集。 他们缓解了问题,但没有解决。 紧凑型配置文件是固定的,因此无法满足部分JRE当前和将来的所有需求。

由Riccardo Cuppini在CC-BY-NC-ND 2.0下发布。

发布时间由里卡多Cuppini下, CC-BY-NC-ND 2.0 。

拼图项目的目标

Jigsaw项目旨在通过引入语言级机制来模块化大型系统来解决上述问题。 此机制将在JDK本身上使用,开发人员也可以在自己的项目上使用。 (有关下一个计划功能的更多详细信息,请参阅下一篇文章。)

重要的是要注意,并非所有目标对于JDK和我们的开发人员都同样重要。 许多代码与JDK更为相关,并且大多数代码不会对日常编码产生巨大影响(与lambda表达式或默认方法不同 )。 他们仍将改变大型项目的开发和部署方式。

可靠的配置

各个模块将声明其对其他模块的依赖性。 运行时将能够在编译时,构建时和启动时分析这些依赖关系,因此可以因缺少或冲突的依赖关系而快速失败。

强封装

Project Jigsaw的主要目标之一是使模块仅导出特定的软件包。 所有其他软件包均为该模块专用。

模块私有的类应该以私有字段完全私有的方式私有。 换句话说,模块边界不仅应确定类和接口的可见性,还应确定其可访问性。

马克·雷因霍尔德(Mark Reinhold)–拼图项目:聚焦全局

模块对库或其他模块的依赖关系也可以保持私有。 因此,两个模块可以使用同一库的不同版本,每个模块都将其自身依赖于该代码。 然后,运行时将版本分开,从而防止冲突。

改进的安全性和可维护性

模块内部API的强大封装可以大大提高安全性和可维护性。

这将对安全性有所帮助,因为关键代码现在已从不需要使用它的代码中有效地隐藏了。 由于模块的公共API可以更容易地保持较小的尺寸,因此使维护更加容易。

随意使用Java SE Platform实现内部的API既有安全风险,又有维护负担。 提议的规范提供的强大封装将允许实现Java SE平台的组件阻止对其内部API的访问。

JSR 376

性能提升

通过明确使用代码的范围,可以更有效地利用现有的优化技术。

当已知某个类只能引用其他一些特定组件中的类,而不引用运行时加载的任何类时,许多提前进行的全程序优化技术可能更有效。

JSR 376

也可以为有关现有注释的代码编制索引,以便无需进行完整的类路径扫描就可以找到此类。

可扩展平台

通过将JDK模块化,用户将有可能选择自己需要的功能并创建仅由所需模块组成的自己的JRE。 这将保持Java作为小型设备和容器的关键角色的地位。

提出的规范将允许Java SE平台及其实现分解为一组组件,开发人员可以将这些组件组装成自定义配置,这些自定义配置仅包含应用程序实际需要的功能。

JSR 376

反射

我们已经看到Java在加载类的方式,在庞大且不断增长的,僵化的运行时中封装方面存在一些问题。 Jigsaw项目旨在通过引入一种模块化机制来解决此问题,该机制将应用于JDK,并且也将对用户可用。

它保证了可靠的配置和强大的封装,这可以使JAR / classpath成为过去。 它可以用来提高安全性,可维护性和性能。 最后,用户可以根据自己的需要创建Java运行时。

本系列的下一篇文章将讨论Project Jigsaw将带给Java 9的功能。敬请期待!

翻译自: https://www.javacodegeeks.com/2015/06/motivation-and-goals-of-project-jigsaw.html

如何判断无法到达目标的拼图

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

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

相关文章

javafx显示image_JavaFX技巧20:有很多要显示的吗? 使用画布!

javafx显示imageJavaFX应用程序似乎有两种:第一种使用带有节点和CSS样式的场景图,第二种使用单个画布。 但是,将这两种方法混合使用是完全合法的。 尤其是当您的应用程序必须显示大量详细信息时,您很容易最终创建成千上万个节点。…

c语言中|的含义

点击上方蓝字关注我,了解更多咨询||在c语言中的意思是逻辑OR(或)运算,运算符两端有一个变量为真,则结果为真。比如a||b表示a和b做逻辑OR(或)运算,只要有任何一个变量为“真”&#x…

30 校准_校准or质控,傻傻分不清楚

今天发个福利,应kkz的要求,聊一聊我对IVD校准和质控的个人理解。非专业科普文,欢迎交流~先来讲个小故事:我小的时候,家里用的挂钟每隔一段时间就要调准一下。那个时候没有网络,爸妈是对着中央新…

C语言查找数组最大最小值

点击上方蓝字关注我,了解更多咨询C语言查询最大最小值的实现思路:定一个变量存储最大值或最小值,变量的初始值取自数组的第一个元素,然后遍历数组,如果遍历到的元素比变量的值大,就把值赋给变量&#xff0c…

c语言中%s的含义你知道吗?

点击上方蓝字关注我,了解更多咨询%s在C语言中代表字符串型格式符,一般用在printf、sprintf等字符串格式化函数中,用于决定格式化参数的数据类型。整数类型是%d,单精度浮点类型,也就是小数是%f,字符类型%c%c,%s这些代表…

mysql 1千万 like优化_MYSQL千万级数据量的优化方法积累

1、分库分表很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之…

C语言while循环要点你会吗

点击上方蓝字关注我&#xff0c;了解更多咨询while语句在使用过程需要注意几个要点&#xff1a;一、无限循环先来看看以下的代码示例int n 0;while(n<3)printf("n %d", n);n;执行代码后&#xff0c;循环输出n0。在上述代码中&#xff0c;虽然有n自增&#xff0c…

C语言if与else匹配规则你知道多少?

点击上方蓝字关注我&#xff0c;了解更多咨询如果程序中有多个if和else&#xff0c;那如何配对&#xff0c;if和else的匹配规则简单总结为以下两点&#xff1a;1.无花括号&#xff0c;else和最近的if匹配2.有花括号&#xff0c;else和内含有if语句的第1个if语句匹配我们通过两个…

C语言中+=的含义你明白吗?

点击上方蓝字关注我&#xff0c;了解更多咨询c语言中是代表两个变量相加&#xff0c;并将答案记录在左边的变量里。比如xy实际代表的表达式为&#xff1a;xxy。这是c语言为了语言的简洁性推出的组合运算。常见的运算符都可以这样组合运算。一、源码演示&#xff1a;二、输出结果…

C语言中「」的含义

点击上方蓝字关注我&#xff0c;了解更多咨询取决于在scanf中使用还是在printf中使用。在scanf中使用&#xff0c;则添加了*的部分会被忽略&#xff0c;不会被参数获取。例如&#xff1a;int a,b;char b[10];scanf("%d%*s",&a,b)&#xff1b;输入为&#xff1a;1…

mysql ondumplictcate_4.5万字手把手教你实现MySQL TB级数据存储!!

写在前面业界对系统的高可用有着基本的要求&#xff0c;简单的说&#xff0c;这些要求可以总结为如下所示。系统架构中不存在单点问题。可以最大限度的保障服务的可用性。一般情况下系统的高可用可以用几个9来评估。所谓的几个9就是系统可以保证对外提供的服务的时间达到总时间…

c语言中+ =和=+有什么区别

点击上方蓝字关注我&#xff0c;了解更多咨询c语言中 和有什么区别&#xff1a;区别在于 是简写&#xff0c;a 1就是a a1&#xff1a;并不是简写&#xff0c;a a直接对a的赋值&#xff0c;符号代表的是正负&#xff08;完全可以省略不写&#xff09;&#xff0c;即a b其实就…

jvm7 jvm8_我们真的仍然需要32位JVM吗?

jvm7 jvm8即使在今天&#xff08;2015年&#xff09;&#xff0c;我们仍然有两个版本或Oracle HotSpot JDK –已调整为32或64位体系结构。 问题是我们是否真的想在服务器甚至笔记本电脑上使用32位JVM&#xff1f; 我们应该有很受欢迎的意见&#xff01; 如果只需要较小的堆&…

C语言中的printf函数,你觉得它简单吗?

点击上方蓝字关注我&#xff0c;了解更多咨询什么是printf函数&#xff1f;printf函数是C语言当中的输出函数&#xff0c;是用来将内容显示在屏幕上的&#xff0c;是C库中的一种函数。printf函数的用法printf函数使用起来很简单&#xff0c;格式&#xff1a;printf&#xff08;…

tp5怎么生成短链接_请问在tp5中怎样才能使用url函数?

MM们thinkphp中的自动完成函数调用有两种不同的方法&#xff0c;分别为callback与function;12345678910namespace Home\Model;use Think\Model;class UserModel extends Model{protected $_auto array (array(status,1), // 新增的时候把status字段设置为1array(password,md5,…

cuba 平台_CUBA平台的理念

cuba 平台最近发生了很多事。 在CUBA于6月1日正式发布之后&#xff0c;我们推出了新版本&#xff0c;在一些Java网站上发布了我们的第一篇文章&#xff0c;并在伦敦的Devoxx UK会议上介绍了该平台 。 但是在热潮继续之前&#xff0c;大约是时候阐明CUBA背后的哲学了。 与企业软…

C语言进阶:探讨函数指针的的定义与使用

点击上方蓝字关注我&#xff0c;了解更多咨询函数指针今天准备和大家讲解一下我们C语言编程的函数指针&#xff0c;为什么函数也需要指针呢&#xff1f;我是这样理解的函数指针方便我们对函数的调用&#xff0c;当我们需要把一个函数作为参数传给其他参数的时候就必须使用函数指…

jvm gc停顿_在JVM中记录世界停顿

jvm gc停顿不同的事件可能导致JVM暂停所有应用程序线程。 这种暂停称为世界停止&#xff08;STW&#xff09;暂停。 触发STW暂停的最常见原因是垃圾回收&#xff08; 例如github中的示例 &#xff09;&#xff0c;但是不同的JIT操作&#xff08; 示例 &#xff09;&#xff0c;…

-在c语言中什么含义

点击上方蓝字关注我&#xff0c;了解更多咨询->是一个整体&#xff0c;它是用于指向结构体。1.换种说法&#xff0c;如果我们在C语言中定义了一个结构体&#xff0c;然后申明一个指针指向这个结构体&#xff0c;那么我们要用指针取出结构体中的数据&#xff0c;就要用到“-&…

putchar在c语言中怎么用

点击上方蓝字关注我&#xff0c;了解更多咨询putchar在c语言中的作用是向终端输出一个字符&#xff0c;也属于一种C库函数&#xff0c;包含在C标准库中&#xff0c;putchar是一个字符输出&#xff0c;用于快写的时候很方便。首先来看一下c语言的含义&#xff0c;c语言是一门面向…