百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Java 20年,以后将往哪儿走?(java未来前景)

wptr33 2025-03-20 20:06 14 浏览

在今年的Java 20周年的庆祝大会中,JavaOne 2015 的中心议题是“Java 的20年”。甲骨文公司Java平台软件开发部的副总裁Georges Saab的主题演讲就将关注点放在了java的发展历程、它主要的发展里程碑,并且深度关注于Java8及其更新。甲骨文公司Java平台首席架构师Mark Reinhold的主题演讲奠定了Java发展的路线图,并展示了定于2016年Q3季度发布的Java9 。

Reinhold提到Java成功的关键在于辨识到了痛点;找出了缺失的抽象类并添加了抽象类,以此方式来满足现有的解决方案。

Reinhold还说到“目标是随着时间的推移,要持续改善开发人员的开发效率,同时保留Java的可读性、简化性、通用性以及兼容性的核心价值。”

他推断,缺失的抽象类已经引领了Java5的泛型与Java8的lambdas表达式中的重大创新。2008年,Jigsaw项目引入了模块的概念,以此来解决两个不同的痛点:类路径地狱(Classpath Hell)和庞大的单体 JDK。

类路径地狱(Classpath Hell)

据Reinhold所称,类路径(Classpath)的根本问题在于它们不仅仅是类。他说“类路径是一种查找类的方式,不必关心组件、包甚至它们的预期用途。”

在类路径中,甚至都无法确定你们寻找的类就在jar文件内;我们也不知道是否有任何与应用开发接口相关的冲突。并且,当开发人员不知道或是不理解内部接口的目的,并对其进行改变时,内部接口就可能会暴露出一些安全问题。

  • 关注InfoQ[ID:infoqchina]了解更多技术领域干货内容。

据Reinhold所称,模块为jar文件提供了一个强有力的抽象类,模块是一个程序组件,它不仅能在java编程语言中实现,在java 虚拟机中同样也能。正如他所说的“模块是脱离类路径地狱(Classpath Hell)的关键。”

  • 模块可被看做是包的容器,与此同时,该模块也表述了它与其他模块是如何联系的;

  • 模块是包的容器;

  • 模块为其依赖的其他模块命名;

  • 一个模块不会对其他模块进行干扰;

  • 模块只有通过其它依赖它的模块才能输出特定的包来使用。

为了在Java9中使用模块,所需的jar文件中的模块必须在module-info.java文件中进行声明。文件名不是一个类的名字,它是一个约定,就像package-info.java一样;但它仍可以通过javac进行编译。模块化的jar文件包含module-info.class。该模块化的jar文件可作为一个单独的产物进行传送;对于java9预先发布的版本来说,模块化jar文件就像常规jar文件一样运行。

Reinhold提到,通过允许终端用户以从下到上或从上到下的方式将现有的系统进行模块化,模块的采用就大大地简化了。

单体JDK

Jigsaw项目提供了很多新的用例,传统意义上来讲这些用例不适合庞大的单体Java SE JDK。某些用例包括:

  • 小型设备——没有足够空间去存储所有的Java SE 包。

  • 云应用——不需要复制整个的Java SE JDK。因为在云中,密度是主要因素。(注:密度指的是能为一套特定的软硬件进行交付的系统与服务的数量。)

  • 维护与安全——庞大、整体化的JDK系统在子系统之间存在着千丝万缕的联系。并且,它缺乏内部接口的封装,这会导致安全问题。

据Reinhold所称,“模块为强有力的封装提供可依赖的配置。”

有了模块化,伴随着增强的安全性,开发人员只使用需要的功能。因此,在JDK 9中,所有非关键的内部接口将被封装。某些关键的内部接口例如sun.misc.Unsafe仍然可以访问。(绝大部分)内部接口封装的提出表明“JDK 9中引入的、替换掉原有版本的关键内部接口在JDK 9中将被弃用,或者被封装或者在JDK 10中被删除。”Reinhold 提到被封装后的内部接口仍可以在编译时和运行时通过命令行标志来进行访问。

在JavaOne 2015主题演讲上,甲骨文公司Java平台开发部的负责人Georges Saab、Mark Reinhold、Brian Goetz与其他人一起,谈论了Java20年来的发展历程。

在本文的第一部分,InfoQ介绍了Reinhold的主题演讲。现在,我们将介绍Brian Goetz,他是Java平台开发部的Java语言架构师,他窥见了Java10甚至更高版本的所有内在机理,尤其是谈论到Valhalla项目和Panama项目,而它们正是为Java 虚拟机和Java语言本身孕育重大进展的两个项目。这些进展旨在丰富Java虚拟机与底层硬件(包括操作系统)以及非Java应用编程接口之间的关联。

动机

随着时间的推移,越来越复杂的处理器核心设计已经影响了成本模型的时钟周期和底层硬件/中央处理器内核的分发槽问题。高速缓存缺失是非常昂贵的,尤其是当你还需要从主内存中读取数据的时候。因此急需Java和Java虚拟机具有更密集和平整的内存布局来提供更好的缓存和内存效率,从而跟上当今时代硬件的发展步伐。

Valhalla项目

Goetz提到Valhalla项目包括了一些Java语言和Java虚拟机的特色,这些特色用于与纯数据共同协作,而这些纯数据不包含对象强加的所有开销。他为我们举了以下的例子,并进行了相应的解释:

假设有一个简单的域对象 Point Class:

class Point { final int x; final int y; }

一个X-Y的实例数组会伴随着150%的内存开销,只为表示数据的两个词;一个两个词的对象头(通常用于所有的对象)及其元素,作为Point对象的引用,再加上每一个Point对象的头:

值类型

如果Point类不可改,我们就不要求它的身份;我们可以将Point类以数值类的形式定义为一个纯数据类型的Point。

value class Point { final int x; final int y; }

在这个例子里,这样的数值类型将不存在间接引用。因此,我们拥有一个友好的高速缓存布局,而这个布局不仅可以高效地使用内存,还具有更好的局域性。

据Goetz称:

数值类型就像类和基元之间的高速公路…从代码上来说,它们像类,但是从表现上来说,它们像整型变量。

特化泛型

有人提议通过增强Java语言和Java虚拟机来加强对超基元泛型的支持。关于数值类型的好消息就是它们可以向基元类型那样装箱了。结果,泛型被支持的程度最终也将超过所有数值类型。

据Goetz所称,即便你工作时用的是:

ArrayList

但实际上你想要的是:

ArrayList

因此现阶段核心Java库中无法实现你用前者工作却追求后者。但当你指定

ArrayList

其内存控制和内存开销的低效性与之前x-y Point类数组的例子十分相似。

如果指定:T为整型,对T进行装箱(Box for T=int),并对值类型进行扩展,开发者就会实现之前数值类型的那个例子中说的巨大的成本效益。

Panama项目

接下来,Goetz继续讨论Panama项目,该项目旨在为本地数据(例如:本地堆中的数据)和本机代码(例如:C中的函数)以更快、更加可信和更加安全的方式提供Java虚拟机的访问权限。

在Panama项目中,名为jextract的本地头文件输入工具会提取布局元数据(例如:C的头文件),并生成Java接口去调用本地方法或访问本地结构。在运行时期间,Java虚拟机会生成与用户可能编写的JNI代码相似的代码。

Goetz为我们举了个例子,该例子需要将指针传递给结构,以便从time.h中调用gettimeofday。因此,我们采用jextract来解析头文件,同时也会得到机器类型的信息。所得到的jar文件具有结构的定义和方法的声明。

因此,所有需要调用上述方法的类与结构都是时间库的参考,同时也是一种结构的创造,正如以下代码所示。

正如上述代码所示,之后想要获取属性就像调用getter方法一样简单了。

相关推荐

SQL轻松入门(5):窗口函数(sql语录中加窗口函数的执行)

01前言标题中有2个字让我在初次接触窗口函数时,真真切切明白了何谓”高级”?说来也是一番辛酸史!话说,我见识了窗口函数的强大后,便磨拳擦掌的要试验一番,结果在查询中输入语句,返回的结果却是报错,Wh...

28个SQL常用的DeepSeek提示词指令,码住直接套用

自从DeepSeek出现后,极大地提升了大家平时的工作效率,特别是对于一些想从事数据行业的小白,只需要掌握DeepSeek的提问技巧,SQL相关的问题也不再是个门槛。...

从零开始学SQL进阶,数据分析师必备SQL取数技巧,建议收藏

上一节给大家讲到SQL取数的一些基本内容,包含SQL简单查询与高级查询,需要复习相关知识的同学可以跳转至上一节,本节给大家讲解SQL的进阶应用,在实际过程中用途比较多的子查询与窗口函数,下面一起学习。...

SQL_OVER语法(sql语句over什么含义)

OVER的定义OVER用于为行定义一个窗口,它对一组值进行操作,不需要使用GROUPBY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。...

SQL窗口函数知多少?(sql窗口怎么执行)

我们在日常工作中是否经常会遇到需要排名的情况,比如:每个部门按业绩来排名,每人按绩效排名,对部门销售业绩前N名的进行奖励等。面对这类需求,我们就需要使用sql的高级功能——窗口函数。...

如何学习并掌握 SQL 数据库基础:从零散查表到高效数据提取

无论是职场数据分析、产品运营,还是做副业项目,掌握SQL(StructuredQueryLanguage)意味着你能直接从数据库中提取、分析、整合数据,而不再依赖他人拉数,节省大量沟通成本,让你...

SQL窗口函数(sql窗口函数执行顺序)

背景在数据分析中,经常会遇到按某某条件来排名、并找出排名的前几名,用日常SQL的GROUPBY,ORDERBY来实现特别的麻烦,有时甚至实现不了,这个时候SQL窗口函数就能发挥巨大作用了,窗...

sqlserver删除重复数据只保留一条,使用ROW_NUMER()与Partition By

1.使用场景:公司的小程序需要实现一个功能:在原有小程序上,有一个优惠券活动表。存储着活动产品数据,但因为之前没有做约束,导致数据的不唯一,这会使打开产品详情页时,可能会出现随机显示任意活动问题。...

SQL面试经典问题(一)(sql经典面试题及答案)

以下是三个精心挑选的经典SQL面试问题及其详细解决方案,涵盖了数据分析、排序限制和数据清理等常见场景。这些问题旨在考察SQL的核心技能,适用于初学者到高级开发者的面试准备。每个问题均包含清晰的...

SQL:求连续N天的登陆人员之通用解答

前几天发了一个微头条:...

SQL四大排序函数神技(sql中的排序是什么语句)

在日常SQL开发中,排序操作无处不在。当大家需要排序时,是否只会想到ORDERBY?今天,我们就来揭秘SQL中四个强大却常被忽略的排序函数:ROW_NUMBER()、RANK()、DENSE_RAN...

四、mysql窗口函数之row_number()函数的使用

1、窗口函数之row_number()使用背景窗口函数中,排序函数rank(),dense_rank()虽说都是排序函数,但是各有用处,假如像上章节说的“同组同分”两条数据,我们不想“班级名次”出现“...

ROW_NUMBER()函数(rownumber函数与rank区别)

ROW_NUMBER()是SQL中的一个窗口函数(WindowFunction)...

Dify「模板转换」节点终极指南:动态文本生成进阶技巧(附代码)Jinja2引擎解析

这篇文章是关于Dify「模板转换」节点的终极指南,解析了基于Jinja2模板引擎的动态文本生成技巧,涵盖多源文本整合、知识检索结构化、动态API构建及个性化内容生成等六大应用场景,助力开发者高效利用模...

Python 最常用的语句、函数有哪些?

1.#coding=utf-8①代码中有中文字符,最好在代码前面加#coding=utf-8②pycharm不加可能不会报错,但是代码最终是会放到服务器上,放到服务器上的时候运行可能会报错。③...