拼图项目的动机和目标

几周前,我写了一篇关于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,许多用例根本不需要。

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

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

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

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

拼图项目的目标

拼图项目旨在通过引入一种语言级机制来模块化大型系统来解决上述问题。 此机制将在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/360417.shtml

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

相关文章

android中按一个按钮弹出字,允许用户在Android中长按一次即可编辑按钮文字

我想允许App用户在Android中更改Button文本。 当用户单击按钮时,它应该执行某些操作,但是当他/她长按按钮时,将弹出一个编辑文本,并且无论用户键入什么内容都应另存为按钮文本。到目前为止,我已经完成了以下操作。btn1…

异常作弊– Java 8 Lambdas

异常作弊– Java 8 Lambdas 撇开关于Checked vs Runtime异常的宗教辩论&#xff0c;有时由于库的构造不佳&#xff0c;处理Checked示例会使您发疯。 考虑一下您可能要编写的以下代码片段&#xff1a; public void createTempFileForKey(String key) {Map<String, File>…

hdu 4738 桥

题目&#xff1a;还是自己看题目吧 trick&#xff1a;当不连通时不需要人去炸。否则&#xff0c;当桥的费用为0时当然需要一个人去炸。。。 #include <set> #include <map> #include <list> #include <cmath> #include <queue> #include <sta…

关于单元测试脚手架的几点思考

莱昂&#xff1a;Luc Besson的专业人士 当我开始通过创建相同的对象并准备数据来运行测试来重复使用单元测试方法时&#xff0c;我对设计感到失望。 带有大量代码重复的长时间测试方法看起来并不正确。 为了简化和缩短它们&#xff0c;基本上有两个选项&#xff0c;至少在Java…

android 使用c 代码实现,JNI开发实现helloworld,调用自己的C代码实现(1)

JNI开发&#xff0c;实现自己的C代码&#xff0c;helloworld在这里实现一个简单的demo,完成加载自己的C代码使用Android studio&#xff0c;一步一步教你实现在屏幕上显示出helloworld如下图显示&#xff0c;配置号NDK的路径&#xff0c;没有路径的需要自己下载&#xff0c;在A…

使用WSO2 ESB进行邮件内容过滤

每个集成架构师或开发人员都应该熟悉Gregor Hohpe和Bobby Woolf所描述的企业集成模式&#xff08;EIP&#xff09; 。 模式之一是“内容消息过滤器” &#xff08;不要与消息过滤器模式混淆&#xff09;。 使用不同的Mediator在WSO2中有多种方法可以实现此目的。 一种方法是使…

BZOJ 1045 [HAOI2008]糖果传递 ★(环形等分:中位数)

题意 有n个小朋友坐成一圈&#xff0c;每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。 思路 假设平均数是x&#xff0c;且a1给an了k个&#xff08;k<0说明是an给a1了-k个&#xff09;&#xff0c;那么总代价就可以算出来&#xff1a; ananka1-…

android壁纸应用,HPSTR - 可能是你见过最会玩的壁纸应用 - Android 应用 - 【最美应用】...

今天这款 HPSTR 壁纸应用也不例外&#xff0c;HPSTR 主要的壁纸素材源来自 Unsplash(ios/android)、500px(android)、Reddit(android)这些素材源的图片都很优秀&#xff0c;特别是 Unsplash 它是著名的无版权图片网站。它家主要以风景为主&#xff0c;数量也足够多&#xff0c;…

android sqlite批量操作,Android: SQLite批量插入数据的最佳实践

大家都知道&#xff0c;Android里数据库用的是SQLite。在实际开发过程中&#xff0c;我们有时候会遇到批量插入数据的场景。这篇文章给大家分享一个小技巧&#xff0c;让批量插入数据达到最快的目的。首先&#xff0c;我先创建一个Table&#xff0c;里面只有一个字段&#xff1…

编写干净的测试–天堂中的麻烦

如果我们的代码有明显的错误&#xff0c;我们很有动力进行改进。 但是&#xff0c;在某些时候&#xff0c;我们认为我们的代码“足够好”并继续前进。 通常&#xff0c;当我们认为改进现有代码的好处小于所需的工作时&#xff0c;就会发生这种情况。 当然&#xff0c;如果我们…

使用Mockito时遇到的一些问题

最近在使用Mockito时遇到了几个比较tricking的问题&#xff0c;在这里记录一下。 1.如果方法的参数或者返回类型是泛型通配符相关的&#xff08;如<?>&#xff0c;<? extends XXX>&#xff09;&#xff0c;不管你定义的对象类型是否正确匹配&#xff0c;用any(ma…

c语言实现linux下的top命令来获取cpu利用率_有用的一篇笔记,linux 调优各项监控指标...

自开始负责生产环境部署&#xff0c;中间遇到了若干线上环境内存以及CPU的问题。由于微服务以及容器的流行&#xff0c;现在已经可以很方便的使用 K8s prometheus grafana alert 的方式进行监控&#xff0c;这足以覆盖大部分场景。最重要的事情已经交由最适合的组件去做&…

android config.mk,android编译分析之10—config.mk

config.mk可以说是android编译系统中关于配置环境的一个总的makefile&#xff0c;定义了编译环境的方方面面。执行完config.mk就完成了android编译系统的所有准备工作&#xff0c;即准备好了所有的编译需要的全局变量&#xff0c;下一步直接执行make&#xff0c;即可产生镜像文…

在Spring中记录JAX-WS SOAP消息

每当在Spring中使用JAX-WS时&#xff0c;您可能都希望记录传入和传出的SOAP消息-如果仅用于开发过程中的调试。 因此&#xff0c;第一件事就是增加日志级别&#xff0c;对吗&#xff1f; 不幸的是&#xff0c;这将无效。 您将要做的是利用javax.xml.ws.handler.HandlerResolver…

WordPress /wp-admin/includes/post.php user_ID 参数操作权限提升漏洞

漏洞版本: WordPress 3.6 漏洞描述: Bugtraq ID:62346 CVE ID:CVE-2013-4340WordPress是一种使用PHP语言开发的博客平台&#xff0c;用户可以在支持PHP和MySQL数据库的服务器上架设自己的网志WordPress wp-admin/includes/post.php脚本在处理user_ID参数时存在一个安全漏洞&…

rip协议中周期性广播路由信息的报文_技术实操||距离矢量路由协议-RIP

距离矢量路由协议—RIP01距离矢量路由协议概述路由信息协议RIP(RoutingInformation Protocol)的简称&#xff0c;它是一种基于距离矢量(Distance-Vector)算法的协议&#xff0c;使用跳数作为度量来衡量到达目的网络的距离。RIP主要应用于规模较小的网络中。RIP是一种比较简单的…

android中可以有两个焦点吗,android – 如何通过焦点在屏幕上调整两个片段的大小?...

我有三个片段,前两个填充80&#xff05;的屏幕,最后一个填充其余的片段(这个片段永远不会改变大小).我希望,在用户(焦点)输入片段后,调整片段的大小,使其填满屏幕的70&#xff05;(将10&#xff05;留给另一个).像这样&#xff1a;可以通过动态改变碎片的重量吗&#xff1f;或者…

使用tinylog 1.0简化您的日志记录

tinylog的大小仅为75 KB&#xff0c;是广泛使用的经典日志记录框架Log4j和Logback的轻型替代方案。 经过三年的开发&#xff0c;最终版本1.0刚刚于 3月底发布 。 在几个设计问题中&#xff0c;tinylog采取了与Java中经典日志记录框架完全不同的方法。 本文将介绍与Log4j和Logba…

MySQL : 报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost...

MySQL : 报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost 摘自: http://www.cnblogs.com/xyzdw/archive/2011/08/11/2135227.html 报错:1130-host ... is not allowed to connect to this MySql server 解决方法&#x…

华谊兄弟出现什么问题_什么是语言训练?这就要从语言问题的出现说起了

开口、发音是每一个孩子在语言发展过程中所不可少的经历&#xff0c;他们从周围环境中获取到的各种信息转化为想要表达的内容。虽然一开始孩子的语言并没有成年人那么流畅和准确&#xff0c;但随着时间的推移&#xff0c;他们的说话发音愈发成熟。只是&#xff0c;并不是所有孩…