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

几周前,我写了一篇关于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当前和将来的所有需求。

发布时间由里卡多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

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

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

  1. java 拼图_功能项目拼图将Java 9引入

    java 拼图 因此,拼图项目...我们已经对此颇为了解,但尚未看到计划如何兑现其承诺的细节. 这篇文章将精确地做到这一点,并介绍项目的核心概念和功能. 系列 这篇文章是正在进行的有关拼图项目系列的一 ...

  2. 拼图项目的动机和目标

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

  3. java 拼图_拼图项目的诅咒:为什么Java 9一遍又一遍地延迟?

    java 拼图 JDK 9发行日期推迟到2017年7月 距JDK 9发行不到200天,它又被推迟了 . 新的发布日期已更新为2017年7月,比之前推迟的日期晚了四个月. 推迟日期 9月13日,Orac ...

  4. java 拼图_拼图推迟将Java 9的发布日期推迟到2017年

    java 拼图 由于Project Jigsaw的延迟,Java 9的发布日期被推迟到2017年 由于项目延迟的悠久历史,这可能不足为奇,但是看起来备受期待的拼图项目已被延迟. 再次. 好消息是,与上 ...

  5. yolov3为什么对大目标检测不好_从YOLOv1到YOLOv3,目标检测的进化之路

    引言:如今基于深度学习的目标检测已经逐渐成为自动驾驶,视频监控,机械加工,智能机器人等领域的核心技术,而现存的大多数精度高的目标检测算法,速度较慢,无法适应工业界对于目标检测实时性的需求,这时YOLO ...

  6. 多目标优化算法_【实验室论文】基于多种群协同演化的约束多目标优化算法

    欢迎关注智能优化与学习实验室 在很多实际问题中,例如科学.工程设计等领域,衡量一个方案的好坏难以用一个指标来判断,需要用多个目标来刻画,且实际问题通常带有约束条件,这类问题被称为约束多目标优化问题,高 ...

  7. 总结和分析几种判断RecyclerView到达底部的方法

    上一篇文章我讲到用事件分发的原理结合SwipeRefreshLayout写一个RecyclerView的上下拉,里面有一个判断RecyclerView是否到达底部的方法isBottom.我的同事用了这 ...

  8. 摄像头图像分析目标物体大小位置_对智能驾驶系统三种环境传感器布局的冗余关系分析...

    " 目前的自动驾驶汽车需要三类传感器,第一类是IMU传感器.第二类是摄像头.毫米波雷达.激光雷达这类感知传感器.第三类是V2X这类超视距的特殊传感器.惯性测量单元的功能毫无疑问,是测量物体三 ...

  9. php中怎么判断输入密码与原密码一致_「每周FPGA案例」电子密码锁设计

    至简设计系列_电子密码锁 --作者:肖肖肖 --案例作者:WB_Yih 本文为明德扬原创及录用文章,转载请注明出处! 1.1 总体设计1.1.1 概述 随着生活质量的不断提高,加强家庭防盗安全变得非常 ...

最新文章

  1. C语言用warshall算法求传递闭包transitive closure(附完整源码)
  2. [C#] 接收和发送UDP数据
  3. python计算机视觉编程调试问题
  4. c 语言实例大全,c语言实例大全
  5. 三极管放大电路三种类型
  6. 【QGIS入门实战精品教程】4.6:QGIS实现栅格(影像、DEM)的拼接与掩膜提取
  7. 点乘 线性代数_如果看了这些还不懂线性代数,你就来锤我和广坤
  8. HDFS概述(6)————用户手册
  9. 2004-2020历年美赛优秀论文资源
  10. Rust 从入门到精通12-集合
  11. 本周小折腾记录: ipad和电脑完成同屏功能
  12. 在后台管理系统中如何设计账户管理?
  13. Object-C,文件路径API
  14. mac字体渲染精细处理
  15. 通过裁切视频画面来改变视频尺寸 ,同时不影响画质
  16. HTMLday2旅途
  17. Flutter 2.8 正式发布
  18. php 读取 excel 文件并上传数据库
  19. Java 生成二维码(带logo 文字)
  20. ReplicaSet和Deployment

热门文章

  1. I. Space Station(hash记忆化+dp)
  2. Nacos(四)之安装
  3. 面试-线程池的成长之路
  4. html数据复制到剪切板
  5. html的<input type='radio'/>change事件坑
  6. 3 年 Java 应该具备的技能体系
  7. 通往大神之路,百度Java面试题前200页。
  8. [编程入门]宏定义的练习:输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。
  9. Mybatisplus用updateById默认没有传的值不会进行改变
  10. stream 提取某字段_java8从list集合中取出某一属性的值的集合案例