技术开发 频道

2007Java年度技术综述


【IT168专稿】
一、 J2XE在2007年的发展势态和未来走向
1.1 J2SE5.0已成主流、J2SE6.0蓄势待发
    经IT168在2007年的调查发现,JavaSE5.0的使用率最高,达到40.3%,使用率的增加与JavaSE5.0变得更易用有着密切的关系。
    在调查结果中同时还会看到,Java SE 6.0的使用率也已达到13.0%,大有后来者居上之势。Java SE6.0虽然在2006年刚刚发布,但由于Sun在2007年对JavaSE 6.0的bug进行了修正,并对Java SE6.0做了大量的改进,因此,才使Java SE6.0有了和其它JDK版本竞争优势。下面是Java SE 6.0中包含大量全新的或更新版本的JSR规范:

(1)简化开发方面
 199: 编译器API;
 269: 注释处理器(Annotation Processors);
 260: Javadoc标记的更新;
 221: Java数据库连接(JDBC) 4.0;
 223: Java平台的脚本;
(2)XML方面
 105:数字签名;
 173: 一个用于XML的流API
 222: JAXB 2.0
(3)Web 服务方面
 250: 公共注释;
 181: WS Metadata Web Services;
 224: JAX-WS 2.0;
(4)其它
 202: Java Class文件规范升级

1.2 期待Java SE7.0

Java SE6.0还没握热乎,Java SE7.0又快要发布了。不过大家不要太兴奋了,Java SE7.0(代号为海豚Dolphin)肯定不会在今年发布了,也许在2008年发布是一个不错的选择。

遗憾的是,为一门语言添加功能远比删除功能要简单得多。几乎不可避免地,随着时间的推移,语言不是朝着简单的方向发展,而是越来越复杂,越来越让人困惑。即使是那些单独看起来很好的功能,在彼此叠加后也会出现问题。

更令人遗憾的是,Java 社区没有接受这个教训,尽管这种失败并无特殊性。但总有一些太酷又太让人激动的新语法令语言设计者难以抗拒 —— 即便这样的新语法不能解决任何实际问题。于是对 Java 7 的新语言功能就有了巨大的要求,包括闭包、多继承和操作符重载等。

虽然现在新兴的语言总是伴随着更另人兴奋的功能出现,但对于Java来说,历史的包袱实在是太大了,不能随心所欲地为其增加新功能。但还是有很多新的特性可以不费劲地加入其中。如闭包、操作符重载、集合类的新的语法、关系映射语法等等。但我想关于多继承恐怕十有八九不会被加入,因为Java 中有太多东西是基于单个根的继承层次。没有可行的方式改进多继承,使之适应这门语言。

目前已经有很多关于改进Java的新建议,尤其是在新特性和语法上,下面我们带领大家想象一下Java SE7会为我们带来哪些奇迹:

1. 使列表更象数组

在JavaSE以前的版本,引用列表类中的元素要使用get和set方法,如下面的代码所示:

List content = new LinkedList(10);
content.add(0, "data1");
content.add(1, "data2");
String name = content.get(0);

而在Java SE7中则使用如下代码:

List content = new LinkedList(10);
content[0] = "data1";
content[1] = "data2";
String name = content[0];

还有就是在列表初始化时也会和数组初始化类似,代码如下:

LinkedList<Integer> myInt = {1, 100, -20, 30, 102};

上面的两项提议应该非常容易实现,就象Java SE5.0新加的foreach循环一样,只是Java编译器玩的一个小魔术而已,JVM更本就不需要改任何东西。只需要在编译时将其转换为JVM支持的字节码就可以了。但这些新语法对于简化程序却是非常关键的。

2. 有望取代Hibernate,直接支持语言层面的数据持久化
真正能够影响开发人员生产力的特性功能应该是用于管理表、树和映射表的内置原语,比如在使用 XML 和 SQL 时遇到的那些。JavaScript 下的 E4X 项目和 Microsoft 的 Cω 和 Linq 项目是实现这一想法的先驱,但可悲的是,Java 平台似乎错过了这个机会。如果有人想要通过编译器来玩一个潜在的救场的游戏,这里是一个不容错过的好地方。

这个世界上总是不断有人创造另人感到神奇的东西。而在程序语言中内置操作表、树和关系映射的原语就是其中之一。如直接在程序中写XML或SQL,然后将其直接映射成当前语言的类,或是直接引用。微软在.net framework3.5中推出的Linq就是这种原语的一个精彩实现,让我们看看下面的Linq语句:

string[] names = { "bill", "yaoming", "guojingjing", "tianliang", "Mike"};
IEnumerable expr = from s in names where s.Length == 3
 orderby s
  select s.ToUpper();
foreach (string item in expr)
Console.WriteLine(item);

上面的语言其实很简单,就是取数组names的前三个元素,并按大小写排序,最后将其转换成大写后输出到控制台。上面黑体字部分就是Linq语句。Linq除了操作数据名,还可以用类似的方式操作XML以及数据表。而Java SE7现在已经错过了加入这项功能的非常好的时机,但在编译器上做做手脚,来救救场,这也许是个不错的注意。

3. 改进的属性访问机制

在老版本的Java中访问属性都是用类似getXXX()和setXXX()的形式,但在JavaSE7中可能会更方便,有可能使用property关键字(或其它类似的关键字)来声明类属性,如下面是一种可能的语法:

public property string name
(
get // 只读属性
{
... ...
}
set // 只写属性
{
... ...
}
}

JavaSE7的改进建议还很多,这里不一一列举。总之,JavaSE7是非常值得我们期待的,让我们一起等着2008年JavaSE7的真正到来吧!

1.3 J2EE

没有哪部分 Java 编程像 JEE 这么成功,也没有哪部分 Java 编程像 JEE 那样招致如此多的斥责。它是一门每个人都喜欢去讨厌的技术。它复杂、费解并且是重量级的。没有哪部分 Java 编程有这多么第三方努力将其整个替换或部分替换:Spring、 Hibernate、Restlet、aspects、Struts …… 等等。虽然如此,几乎每一个招聘 Java 程序员的商家都要求其有 JEE 经验,因此 Sun 确实是正确的。

在企业级领域里,我能看到的全部趋势就是简单。大块头的框架出局;小而简单的加入了进来。随之增长的是,客户拒绝大块头的 JEE 栈部分,这种趋势还在继续。作为替代的是,客户转向了像 Spring 这样更简单的框架或者完全脱离 Java 平台而投向 Ruby On Rails。对于更简单、更易理解的系统的需求也驱动着对面向服务架构(SOA)和具象状态传输(Representational State Transfer, REST)的兴趣。
最新推出的Java EE5也在不断改变着自己的形象。Java EE5主要聚焦点是易用性和简化开发,它提供了一些新的或者更新的特性,例如EJB3.0、JSF技术和最新的Web Services的API。Java EE5使得编程更加简单和易懂,但是保持了J2EE在Web Services和企业应用程序开发的首选平台地位。
Java EE 5不再象以前那样只注重大型商业系统的开发,而是更关注小到中型系统的开发,简化这部分系统开发步骤,这是它的一个很大的改变之处。
使得系统开发步骤得以简化的最大特征是在JavaSE 5.0中加入Annotations,通过Annotations引入,降低Java EE开发时,既要编码,又要写XML配置文件之苦。
安全是Java EE5的一个重要特点,指的是基于容器的安全访问,无需自己手工编码,具体实现可参考Jdon框架应用演示源码JdonNews。这虽然是基于J2EE1.3编写,但是和Java EE 5区别不是很大。
事务管理也是Java EE 5的一个重要部分,标准中规定了在WEB层中使用事务和线程的处理关系,标准中规定:Web服务器如Tomcat无需在Web层提供事务支持,因为Web组件根本不支持事务繁衍/传递。
2007年4月初, Bill Shannon 已经向JCP提交了Java EE 6 草案。
这也是JCP第一次揭示Java EE的概念,由于先前有JSRs,JSR 313 将不再定义新的 API,但是将调整许多sub-JSRs 的工作来为Java EE 6平台提供一致性。
JCP的站点提供了一些关于Java EE 6的发展趋势:
 扩展性
在Java EE中有些技术以插件的形式增加到Java EE应用服务器上更为合适。通过增加可扩展性的点和更多服务接口,其他技术能够以插件的形式添加到平台实现中显得更加有效和整洁。
 Profiles
Java EE平台应该引入Java EE platform Profiles,由JCP定义,包括Java EE platform的一些技术,增加一些JCP技术,而这些技术不是基于Java EE platform技术的一部分。
 裁减
将某些技术以更合理的方式来从现在平台中裁减出去。减少对使用这些技术的开发者的影响。
 SOA
对web services提供进一步的支持。另外,专家组正在考虑是否在Java EE平台版本中包括SCA定义的工具是否合适。
从上面可以看出,Java EE6将进一步根据开发人员的实际情况考虑,通过提高扩展性和裁剪某些技术,使得开发人员能够按需定制功能。
Java EE 6 预期是在2008年的第三季度完善和发布,2008年将是Java EE的一个丰收年。

我们能够预料出,朝着简单发展的趋势在 2008 年将会延续。许多对 Rails 留下印象的人正试图在其他语言上复制它的成功,比如 Python (Turbo Gears)、Groovy (Grails) 以及 Java (Sails)。这其中的某个有可能成功,但它们如果不提出一些强有力的新举措的话,就不会取得成功。因此,企业仍将加载他们已有的框架:SOA、REST 和 Rails。

1.4 J2ME

    将视线从最大平台移到最小平台上来,我们能期待嵌入式世界带给我们什么?多年以来,Java 平台已经在小设备上取得了相当大的成功,而 2007 很已经成为了这一成功为基础。首先,关注一下移动信息设备描述(Mobile Information Device Profile,MIDP) 的第 3 版,来利用当今更为强大的设备的功能。特别是,我们应该很快就能在一个虚拟机上运行多个 MIDlet,包括在后台运行一个或多个。同样也关注一下加密记录管理系统(RMS)存储和 IPv6 支持。

    Java ME 的可扩缩的 2D 矢量图形(Scalable 2D Vector Graphics, SVG)API 2.0 当前正在开发中,它应扩展在许多设备中的动画功能。除 SVG 动画之外,它也将支持流式音频和视频。如果移动网络开放,这是相当重要的 —— 想想在手机上的 YouTube。(当然,如果网络开放,那就只是没人愿意看的两英寸的公司广告。在这点上,我对美国的情况持悲观态度,而在欧洲也许会更有趣。)

    移动开发者也能期望本年推出第一款支持 Java ME 的 XML API 的手机。此 API 是 SAX、DOM、 StAX 和 JAXP 的一个精选子集,设计它是为了适应内存受限的手机。

    尽管好事连连,Apple 的 iPhone 仍对 Java 平台(作为移动电话开发平台)构成了一个主要的威胁。iPhone 已经是这个星球上最火爆、最有魅力的手机,它已经发布了一年多。问题在于它将成为一个相对封闭的平台,甚至按手机网络标准也是如此,并且它没打算运行 Java 代码。无需多说,对于任何试图向手机、PDA 和个人通讯设备推销第三方应用程序的人来说,这都是一个恐怖的消息。

二、 J2EE服务器的发展回顾和未来趋势
    J2EE是Sun为企业开发而制定的规范。主要包括Web部分和服务部分(如EJB,MQ等)。而这些必须依靠J2EE的核心J2EE服务器来完成。现在流行的J2EE服务器主要分为四大类:
(1) 国外商业J2EE服务器:包括Weblogic、Websphere等;
(2) 国内商业J2EE服务器:如Apusic等;
(3) 开源J2EE服务器:以JBoss为首,由于开源都可以有许可证范围内免费使用,这里将国外和国内的开源J2EE服务器合在一起讨论;

(4) 开源Web服务器:如Tomcat,这一类J2EE服务器只支持Web开发,并不支持EJB等服务,因此,它们的功能比较单一,体积比较小,但现在仍然应用得广泛。

2.1 国外商业J2EE服务器
2.1.1 Weblogic
    经调查显示,WebLogic是当前使用率最高的一种商业J2EE服务器,其使用率为23.1%。
    2007年4月发布WebLogic Server10,它支持Java EE 5和EJB 3.0,旨在使开发者和IT管理者能够加速并从根本上简化Java应用和服务的开发。WebLogic Server 10的正式面市,正是BEA帮助客户充分利用最新标准、简化开发和创建未来SOA的一个很好注解。

    WebLogic Server将继续在应用服务器领域保持领先地位。不断创新与坚实基础相结合,使WebLogic Server继续获得广泛的应用并获得更大的成功。

2.1.2 Websphere
    从调查结果可以看到,Websphere的一种实用率仅次于Weblogic的商业J2EE服务器,其使用率为15.1%。
IBM WebSphere应用服务器是一个Web应用服务器(内含IBM Http Server),它基于 Java的应用环境,用于建立、部署和管理 Internet 和 Intranet Web 应用程序。 这一整套产品进行了扩展,以适应 Web 应用程序服务器的需要,范围从简单到高级直到企业级。

    于2006年4月11日,IBM公司在更新了自己的WebSphere软件及服务,这将为蓝色巨人的面向服务构架(SOA)的成功扫清障碍。

2.2 开源J2EE服务器
2.2.1 JBoss
    JBoss是第一个通过J2EE 1.4认证的主流应用服务器。
   2007年7月,红帽公司宣布SOA专家和世界畅销的SOA作家Thomas Erl,已经为红帽服务模式贡献了知识产权。红帽凭借这项服务模式技术将会在JBoss企业SOA平台上增加独特的能力。
JBoss的最新版本是4.2.2,已于2007年10月发布。
有了SOA作家Thomas Erl贡献的知识产权,读者可以期望2008年JBoss在SOA平台上有一番作为。

2.3 Web应用服务器
2.3.1 Tomcat
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,它是Apache 软件基金会的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。
经调查显示,它是2007年使用率最高的一种Web应用服务器,使用率高达39.6%。
现在Tomcat的最新版本为6.0.14,于2007年3月发布,该版本实现了Servlet2.5和Jsp2.1规范,并且包括了一些额外的特征。
Tomcat6.0设计的时候是用来在JavaSE5.0和更新版本上运行的。
另外,Tomcat6.0使用Eclipse的JDT Java编译器来编译JSP页面。这意味着你不再需要完整的Java开发工具包(JDK)来运行Tomcat,但是Java运行时环境(JRE)还是需要的。Eclipse的JDT Java编译器与Tomcat的二进制分发版本绑定。Tomcat也可以使用JDK或者任何一个由Apache Ant支持的Java编译器的编译器来编译JSP文件。
Tomcat6.0相对于5.0的主要新特性如下所示:
(1)Catalina
 为AprLifecycleListener提供了SSLEngine属性;
 为Comet IO处理增加了API;
 为Servlet2.5提供支持。
(2)Jasper
 为JSP2.1提供支持;
 为EL 2.1提供支持。
(3)Coyote
 HTTP连接器会激活SSL请求的SSLEnabled属性;
 HTTP连接器的内存使用减少;
 如今的Modeler更多的使用动态mbeans,而不是模型化的mbeans,因为后者需要消耗更多的资源。
(4)Cluster
 新的集群配置和新的文档。
Tomcat确实是一个很好的W eb服务器,不仅仅因为其免费,功能强大,更因为其开放性。

三、 Java IDE在2007年的发展状况和趋势
    一批垂死的 IDE 真正点燃了 2007 之火,再一次证明竞争是好事。由于 Eclipse 造成的窘境,Sun 将一些能量和资源注入到 NetBeans 当中,最终开始了一场貌似激烈的竞争。Netbeans针对设计 GUI 具有卓越的原生化外观和出色得多的工具。它所不具有的是 Eclipse 社区。相比 NetBeans,更多的插件和第三方产品是基于 Eclipse 的 —— 至少从量上更多 —— 并且这种趋势仅呈加速之势。

在2007年,Eclipse已经在2007年6月份发布了 3.3 版。这个版本在功能上得到了进一步的增强。如下所示:

(1)SWT方面
 在GTK+上提供打印支持;
 对样式化的文本提供打印行数支持;
 为MAC操作系统提供系统盘支持;
 对写PNG文件提供了支持;
 为PowerPC提供浏览器支持。
(2)调试方面
 浏览所有的参考(只针对JavaSE 6),图示如下: 
   
 双击或者“Ctrl+Shift+B”创建一个断点;
 在删除全部断点时出现一个“是否全部删除时不再提示”的确定框;
 提供了一个“Auto Format”的按钮,可以自动格式化文件。
(3)平台文本方面
 提供更多可用的模板;
 按住Ctrl健,用鼠标滑轮可能一页一页的滚动文本编辑器的内容;
 “org.eclipse.ui.workbench.texteditor.rulerColumns”可以将列分布(靠近)到任何文本编辑器的垂直标尺上去。
(4)JDT界面
 使用Refactoring > Create Script来从一个重构历史中创建脚本,并通过 Refactoring > Apply来应用它;
 更多的Java搜索选项,图示如下: 
   
 拷贝一小段代码后转到package模式,不选择任何项目后,右键选择“Paste”按钮,可创建一个新的项目,并将该段代码放入到某个类中。
更多的更新信息请参考官网的文档。

而Sun 也兑现了它当初的承诺,按时发布了NetBeans 6。这个版本在技术上也得到了一定的增加,下面是NetBeans所提供的主要功能:
 Enterprise JavaBeans (EJB) 3.0
 JAX-WS 2.1
 Java Persistence (JSR-220)
 JavaServer Faces 1.2 (JSR-127)
 Java Servlet 2.5
 JavaServer Pages (JSP) 2.1
 Struts 1.2.9
 Java API for XML-based Remote Procedure Calls (JAX-RPC) 1.6
 Java APIs for XML Registries (JAXR) 1.0
 Java API for XML Processing (JAXP) 1.4
 Java Architecture for XML Binding (JAXB) 2.1
 JavaServer Pages Standard Tag Library (JSTL) 1.1

    NetBeans 在2008年很可能将继续赢得 Eclipse 的市场份额。这是从很早以前就开始了的,这方面还有更大的增长空间。(Sun 无情地推动 NetBeans 和 JDK 下载并没伤害到任何一个)。也许到2008年底,两种 IDE 也许将瓜分这个市场,平分天下。
    同时,自信满满的 IntelliJ IDEA 用户将继续疑惑于这一团混乱的场面。他们的信念是:IntelliJ IDEA 是最好的 Java IDE。尽管如此,大多数用户不会对 500 美元的标价视而不见,因此其市场份额将继续在 5% 上下波动。

四、Java的桌面应用悄然兴起
    尽管许多人还没注意到,但 Java 平台真正出现在桌面上到现在已经有四五年了。已经有几个优秀的桌面应用程序是用 Java 代码编写的,包括 RSSOwl、Limewire、Azureus、Eclipse、NetBeans、CyberDuck 等等。这些应用程序几乎囊括了每一个可用的 GUI 工具包,包括 Swing、AWT、SWT,甚至是平台原生的工具包,如 Mac OS X 的 Cocoa。这些GUI工具包各有千秋,因此,很难说它们在2008年年会有哪个工具包在众多工具包中胜出,尽管 Swing 在制造一些保留本色的应用程序方面似乎比其他工具包表现得更为出色。

    用 Swing 进行开发仍是相当有挑战性的,但随着 Swing 应用程序框架的到来,这种情况也许会在明年得到改善。这一框架目前尚在 Java Community Process 中作为 JSR 296 开发。下面是 JSR 关于此的描述:
    编写良好的 Swing 应用程序试图为启动和停止,以及管理资源、行为和会话状态的代码使用相同的核心元素。新应用程序从头开始创建所有这些核心元素。Java SE 不支持构造应用程序,这常常让开发新手们感到有点茫然,特别是在他们打算构建一个规模远超于 SE 文档中提供的例子的应用程序时。

    通过定义 Swing 应用程序的基本结构,这项规范(最终)会添补该空白。它会定义一小套可扩展的类或 “框架”,用于定义相对于大多数桌面应用程序较普遍的基础设施。

    Swing 应用程序框架应支持典型应用程序中的大多数东西,允许开发人员恰在一些自定义的点处插入,如启动和停止时。在启动和停止之间,它将处理 windows 的保存和恢复,以及应用程序的其他部分。最后,它将允许开发人员编写在 Swing 事件分派线程外运行的异步行为。

    改善 JavaBeans 以及所有依赖它的东西(包括 Swing)的工作尚在继续。JSR 295 正在定义一种将 bean 绑定到一起的标准方式,这样,对一个 bean 的修改就会自动地反映到其他的 bean。例如,一个 GUI 网格 bean 会在其相关数据库 bean 改变时自动更新。

    最终,JSR 303 正在实现一门基于 XML 的验证语言,来声明式地指定任何给定的 bean 将取什么值。int 属性将必须介于 1 到 10 之间,或者 String 属性必须包含一个合法的电子邮件地址。如果幸运,这一切都将在年底以 beta 形式提供,并将在来年的 Java 7 中按时完成。

五、Ruby将成为Java开发人员的另一种选择
    如果世界上只存在一门语言,那么这个世界将会平淡无奇。尽管 Java 平台是开发成熟应用程序的较好选择,但它从来就不适应于小程序或宏。Java 6 意识到了这一点,它添加了 javax.script 包实现,以便和脚本语言(如 BeanShell、Python、Perl、Ruby、ECMAScript 和 Groovy)进行互操作,也添加了一项 invokedynamic 虚拟机指令来允许将动态类型语言直接编译为 Java VM。

    在2007 年,Sun看到了 Ruby 将会成为明日的焦点,尽管这种语言并不是动态语言中最出色的。也许对于很多喜爱动态语言的开发人员来说,Python 代码似乎比 Ruby 代码更简洁更易于理解,我认为大多数 Java 程序员都会这样认为。然而,Python 出来的不是时候。许多开发人员不得不在学习 Python 代码还是学习 Java 代码间作出选择,而多数人选择了 Java 代码。既然他们终于弄懂了 Java 语法,又打算在工具箱中添加另一门语言,他们想要的是明天的语言,而不是昨天的语言,而那门语言似乎就是 Ruby。更重要的是,Ruby 的 Ruby on Rails 是一个绝对杀手级的应用程序。它的简单性对于多数觉悟了的 Java 企业版(Java Enterprise Edition,JEE)开发人员来说具有难以置信的魅力。

    除了 Rails,比起其他脚本语言,JRuby 项目和现有的 Java 代码很好或更好地集成到了一起。事实上,JRuby 也许会超越标准 Ruby 分布,并成为 Ruby 程序员们更偏爱的平台,而不止是 Java 程序员们将 Ruby 作为第二种选择。这很好。Python 程序员们会这样反对:他们这些年来已经将 JRuby 最好的方面加入到 Jython 中,但很不幸的是:Ruby 获得了契机,而 Python 没有。

    其他脚本语言会被逐渐逐出界外。Perl 太过时了,不能很好地适应现代应用程序。Groovy 缺少明确的视角,还趋向于将计算机科学的时髦用语凌驾于可用性和熟悉性之上,这让它深受其苦。BeanShell、Jelly,还有很多其他语言可能都从未吸引过超过一个的称心追随者。来年的这个时候,到处都会是这样的呐喊:Ruby 将成为 Java 程序员们首选的脚本语言。


六、开源将会给Java带来真正的繁荣
    2007 年上半年,Sun 将在一个开源许可协议下发布 Java 开发包(JDK)。解除 JDK 的禁锢对于 Java 开发人员社区来说是巨大的一步,它将在今后的十年中推动 Java 平台的发展。

    JDK 的质量将会显著改善,因为程序员们不再仅仅报告 bug 并开始修复。Java Developer Connection 的 bug 报告将会包括对 JDK 中的问题部分的详细分析,并提供修复的补丁。正如Linus 法则 所陈述的那样,“只要给予足够的关注,任何 bug 都是显而易见”,即调试是可并行进行的。优化也是一样。开源使两者得以并行。

    遗憾的是,设计并不是和调试、优化一样可以并行完成的。清洁的 API 有时也需要有一只独裁的手。独裁虽有很多缺点,但是为了保持Java API的纯洁和一致,也许这是唯一的方法。

    Sun 在2007年已经发布了一个Java 7(Dolphin) 的一个早期的 beta 版,以此作为开端。Sun 无法发布更早的 JDK 版本,因为存在一些只有在 Dolphin 中才能解决的构建问题和许可协议问题。尽管如此,仍有望看到第三方着手进一步细分 Sun 的版本,来提供 Java 6、Java 5、Java 1.4,甚至更早版本的流行开源实现。

    在以前,JDK一直是由Sun全权负责,而从Java7开始,彻底由开源社会负责开发和维护,从而使参与的人数大大增加,真正体现了“人人为我,我为人人”的互联网精神。也许这是一个好的开端,Java真的会从这一点开始一飞冲天,这将会为每一个使用Java的开发人员带来无限的荣耀,但愿Java可以真的象我们期望的那样,再次成为奇迹!
0
相关文章