`
longgangbai
  • 浏览: 7326124 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 5 的语言特性

阅读更多

  Java™ 5 添加了许多强大的语言特性:泛型、枚举、注释、自动装箱和增强的 for 循环。

Java 5 语言特性的实现

           Java 5 中添加的语言特性 —— 泛型、枚举、注释、自动装箱和增强的 for 循环 —— 不需要修改 JVM 的指令集,几乎全部是在静态编译器(javac)和类库中实现的。当编译器遇到使用泛型的情况时,会试图检查是否保证了类型安全(如果不能检查,会发出 “unchecked cast”),然后发出字节码,生成的字节码与等价的非泛型代码类型强制转换所生成的字节码相同。类似的,自动装箱和增强的 for 循环仅仅是等价的 “语法糖”,只是更复杂的语法和枚举被编译到普通的类中。

 

           在理论上,可以采用 javac 生成的类文件,在早期的 JVM 中装入它们,这实际上正是 JSR 14(负责泛型的 Java Community Process 工作组)的成立目的。但是,其他问题(例如注释的保持)迫使类文件的版本在 Java 1.4 和 Java 5 之间变化,因此妨碍了早期 JVM 中装入用 Java 5 编译的代码。而且,在 Java 5 中添加的有些语言特性依赖于 Java 5 库。如果用 javac -target 1.5 编译类,并试图将它装入早期 JVM 中,就会得到 UnsupportedClassVersionError,因为 -target 1.5 选项生成的类的类文件版本是 49,而 JDK 1.4 只支持版最大为 48 的类文件版本。

 

for-each 循环

增强的 for 循环有时叫做 for-each 循环,编译器编译它的时候,情形与程序员提供旧式 for 循环一样。for-each 循环能够迭代数组或集合中的元素

Collection<Foo> fooCollection = ...

for (Foo f : fooCollection) {
    doSomething(f);
}

 

编译器把这个代码转换成等价的基于迭代器的循环

for (Iterator<Foo> iter=f.iterator(); f.hasNext();) {
    Foo f = iter.next();
    doSomething(f);
}


      编译器如何知道提供的参数有一个 iterator() 方法呢?

      javac 编译器的设计者可能已经内置了对集合框架的理解,但是这种方法有些不必要的限制。所以,创建了一个新的接口 java.lang.Iterable(请参阅清单 3 ),并翻新集合类使其实现 Iterable 接口。这样,不是在核心集合框架上构建的容器类也能利用新的 for-each 循环。但是这样做会形成对 Java 5 类库的依赖,因为在 JDK 1.4 中没有 Iterable.

Iterable 接口

public interface Iterable<T> {
    Iterator<T> iterator();
}

枚举和自动装箱

         正像 for-each 循环一样,枚举也要求来自类库的支持。当编译器遇到枚举类型时,生成的类将扩展库类 java.lang.Enum。但是,Iterable 一样,在 JDK 1.4 类库中也没有 Enum 类。

         类似的,自动装箱依赖于添加到原始包装器类(例如 Integer)的 valueOf() 方法。当装箱需要从 int 转换到 Integer 时,编译器并不调用 new Integer(int),而是生成对 Integer.valueOf(int) 的调用。valueOf() 方法的实现利用 享元(flyweight)模式 为常用的整数值缓存 Integer 对象(Java 6 的实现缓存从 -128 到 127 的整数),由于消除了冗余的实例化,可能会提高性能。而且,就像 IterableEnum 一样,valueOf() 方法在 JDK 1.4 类库中也不存在。

 

变长参数

         当编译器遇到用变长参数列表定义的方法时,会把其转换成包含正确组件类型数组的方法;当编译器遇到带有变长参数列表方法的调用时,就把参数装进数组。

 

注释

         定义了注释的之后,可以用 @Retention 对它进行注释,它可以决定编译器对使用这个注释的类、方法或字段执行什么处理。已经定义的保持策略有 SOURCE (在编译时舍弃注释数据)、CLASS (在类文件中记录注释)或 RUNTIME (在类文件中记录注释,并在运行时保留注释,这样就可以反射地访问它们了)。

 

其他的库依赖关系

         在 Java 5 之前,当编译器遇到尝试连接两个字符串的情况时,会使用帮助器类 StringBuffer 执行连接。在 Java 5 及以后的版本中,转而调用新的 StringBuilder 类,JDK 1.4 及以前的类库中不存在该类。

 

访问 Java 5 特性

        因为语言特性对库支持的依赖,即使使用 Java 5 编译器生成的类文件能够装入早期 JVM 版本,执行也会因为类装入错误而失败。但是,通过对字节码进行适当转换,仍有可能解决这些问题,因为这些遗漏的类并不包含实际的新功能。

 

JSR 14

      在 Java 泛型规范(以及其他 Java 5 新添加的语言特性)的开发期间,在 javac 编译器中添加了试验性的支持,以便让它能使用 Java 5 的语言特性,并生成能在 Java 1.4 JVM 上运行的字节码。虽然这些特性不受支持(甚至是文档),但许多开源项目都使用了它们,使得开发人员能使用 Java 5 语言特性编码,并生成能在早期 JVM 上使用的 JAR 文件。而且,既然 javac 是开源的,那么这个特性有可能得到第三方的支持。要激活这些特性,可以用 -source 1.5-target jsr14 选项调用 javac

 

 

javac 的 JSR 14 目标模式使编译器生成与 Java 5 语言特性对应的 JDK 1.4 兼容字节码

  • 泛型和变长参数编译器在泛型出现的地方插入的强制转换不依赖类库,所以能够在 Java 5 之前的 JVM 上很好地执行。类似的,编译器在出现变长参数列表的地方生成的代码也不依赖类库

  • for-each 循环:当迭代数组时,编译器生成归纳变量和标准的数组迭代语法。当在 Collection 上迭代时,编译器生成标准的基于迭代器的语法。当在非集合的 Iterable 上迭代时,编译器生成错误。

  • 自动装箱编译器不生成对包装器类的 valueOf() 方法的调用,而是生成对构造函数的调用。

  • 字符串连接javac 的 JSR 14 目标模式使编译器生成对 StringBuffer 的调用而不是对 StringBuilder 的调用。

  • 枚举javac JSR 14 目标模式对枚举没有特殊支持。尝试使用枚举的代码会失败,在寻找 java.lang.Enum 基类时出现 NoClassDefFoundError。 (JSR14竟然不支持呀??)

    使用 JSR 14 目标模式允许在 “简易” 情况下编写使用泛型、自动装箱和 for-each 循环的代码,这对多数项目来说可能足够了。这很方便,如果不支持的话,编译器会一次生成基本兼容的字节码。

 

Retroweaver

JSR 14 目标模式不支持某些 Java 5 语言特性(例如 Iterable 和枚举)。Retroweaver 和 Retrotranslator 这类开源项目采用的另一种方法是用 -target 1.5 生成字节码,然后自动将字节码转换成与 JDK 1.4 兼容的东西。

首先是 Retroweaver,它能处理 javac -target JSR 14 能处理的所有情况和其他一些情况:

  • for-each 循环Retroweaver 提供了 Iterable 接口的实现,把实现 Iterable 的类重写成实现它自己版本的类。

  • 自动装箱Retroweaver 把对 valueOf() 方法的调用重写成调用对应的构造函数。

  • 字符串连接Retroweaver 用 StringBuffer 代替了 StringBuilder

  • 枚举Retroweaver 提供了 Enum 基类的实现,并重写了实现 Enum 的类,或者调用它的方法以使用自己的版本。

Retrotranslator

        正如在开源世界中经常发生的,如果一个项目停止发展,无疑说明它已经失败,一个新项目会取代它的位置,即使它只是在休息。这就是 Retroweaver 的命运;它的主要维护者中断了项目,另一个类似项目 Retrotranslator 就取代了它的位置。Retrotranslator 提供了与 Retroweaver 相同的特性,外加许多额外特性,目标是支持 Java 5 中添加的重要类库:

  • 把对 java.util.concurrent 类的调用替换成开源 JDK 1.4 backport 中对应的类。

  • 提供了添加到 Java 5 集合框架中的特性的实现,例如 ArraysCollections 中的新方法。类似的,还提供了添加到 Java 5 类库的其他新方法和类的实现。

  • 支持注释的运行时反射。

       Retroweaver 和 Retrotranslator 都能静态地(在编译时)或动态地(在类装入时)执行它们的字节码转换。

           有多种方法可以使他们使用 Java 5 的一些语言特性,同时保持与 JDK 1.4 及以前版本的字节码兼容性。javac 中不支持的 -target jsr14 选项可以为某些 Java 5 语言特性生成与 JDK 1.4 兼容的字节码,并且开源的 Retroweaver 和 Retrotranslator 项目能把多数 Java 5 字节码转换成与 Java 1.4 兼容的字节码。当然,不论选择哪种方式,都不要忘记仔细地进行测试,以验证其确实兼容。

分享到:
评论

相关推荐

    Java语言的特点

    ### Java语言的特点 Java作为一款跨平台、面向对象的编程语言,在软件开发领域拥有着广泛的应用。本文将根据提供的文件信息来深入解析Java语言的主要特点。 #### 一、简单性与面向对象 Java的设计初衷是简化C++的...

    Java编程语言的计算机软件开发应用.pdf

    本文将详细探讨Java语言的主要特点,以及它在实际计算机软件开发中的应用。 首先,Java编程语言的特点是语法结构简单。它的语法设计尽量简化,避免了诸如复杂的运算符和循环嵌套等可能导致编程错误的设计,这使得...

    Java语言的特性

    关于Java语言的特性.exe 详细精彩的介绍了关于java语言的特性,非常值得学习

    JAVA语言的特性

    java的特性 用于新手学习java 了解java的好帮手

    Java语言程序设计.pdf

    5. Java编程语言与C++的关系:文档中出现了Java和C++的比较,体现了Java语言在设计上受到了C++的影响,但Java语言设计者有意避免了一些C++中的复杂性,例如指针和内存管理的复杂操作。 6. Java中类的定义:文档提及...

    《面向对象程序设计JAVA语言程序设计》

    《面向对象程序设计JAVA语言程序设计》 以下是从给定的文件信息中生成的相关知识点: 1. Java 语言程序设计的基础知识点: * 面向对象程序设计的概念和特点 * Java 语言的特点和优势 * Java 语言的基本结构和组成...

    Java语言规范 基于Java SE 8

    该规范针对每一项语言特性都给出了代表性的示例程序,以帮助读者更容易地理解和掌握这些特性。通过阅读本规范,可以全面系统地了解Java语言的各项特性,为充分利用这些特性来编写出更加高效简洁的Java租序提供帮助。...

    基于计算机软件安全开发的JAVA编程语言研究.pdf

    综上所述,JAVA编程语言凭借其强大的语言特性,在计算机软件安全开发中占据着不可替代的地位。通过利用JAVA的多线程、面向对象编程、JDBC和Annotation等技术,可以设计和开发出更加安全可靠、功能强大的软件产品。...

    Java语言程序设计(第2版)第1-6章 课后习题答案.pdf

    Java语言程序设计是指使用Java语言进行程序设计的过程,涵盖了Java语言的基本概念、语法、特性和应用。Java语言是由Sun Microsystems公司开发的一种高级语言,具有平台无关、对象oriented、安全性强等特点。 Java...

    2022年java语言-java语言程序设计.docx

    * 对象oriented:Java 语言是一种基于对象的程序设计语言,支持面向对象编程的所有特点。 * 高效性:Java 语言具有很高的执行效率,适合开发大型应用程序。 * 安全性:Java 语言具有很高的安全性,能够保护用户的...

    第7章 Java语言类的特性(第7版).pptx

    第7章 Java语言类的特性(第7版)第7章 Java语言类的特性(第7版)第7章 Java语言类的特性(第7版)第7章 Java语言类的特性(第7版)第7章 Java语言类的特性(第7版)第7章 Java语言类的特性(第7版)第7章 Java语言类的特性(第7...

    Java语言程序设计第三版-习题答案.pdf

    * 可移植性(Portable):Java语言的最大特点是“一次编程,处处运行”。 * 高性能(High performance):Java语言的字节码与机器码十分接近,使得字节码到机器码的转换十分快捷。 * 多线程(Multithreaded):Java...

    自考04747《Java语言程序设计》课后习题答案全集.doc

    1.1 指出JAVA语言的主要特点和JAVA程序的执行过程。 5 1.2 说出开发与运行JAVA程序的重要步骤。 5 1.3 如何区分应用程序和小应用程序? 5 1.4 说出JAVA源文件的命名规则。 5 1.6 JAVA语言使用什么字符集?共有多少个...

    Java语言概述- Java语言

    Java语言的特点包括: 1. **面向对象**:Java是一个完全面向对象的编程语言,支持类、接口和继承等面向对象特性,使得代码结构清晰,易于维护和扩展。 2. **简单性**:Java的设计目标之一是简化C++的复杂性,去除...

    计算机软件开发的Java编程语言与实际应用分析.pdf

    自从Java语言诞生以来,其简单易学、跨平台的特性,以及不断更新的技术支持,使得Java成为许多企业和开发者首选的编程语言。 Java编程语言的含义和特征是本次分析的重点。首先,Java语言是在C/C++等传统编程语言的...

    Java语言实用教程

    - **Java语言的关键特点**:详细介绍Java的面向对象、简单高效、与平台无关等核心特点。 - **Java语言的主要应用方向**:概述Java在不同领域的应用场景,如Web开发、移动应用开发(Android)、企业级应用等。 ###...

    Java语言程序设计源代码

    在《Java语言程序设计》的源代码中,你可以找到各种示例,涵盖了从基础语法到高级特性的广泛内容,如: 1. **基本语法**:包括变量、数据类型、运算符、流程控制(if语句、switch语句、循环)、方法定义等。 2. **...

    Java语言程序设计进阶篇(第5版)源代码

    通过这些源代码,学习者可以更直观地理解Java语言的高级特性,并且通过实际动手操作,提升解决问题的能力。这是一份宝贵的资源,对于想要深入学习和研究Java的程序员来说,是一份不可多得的学习资料。

    Java语言程序设计

    根据给定的信息,“Java语言程序设计”这一课程主要面向的是中国石油大学(北京)远程教育学院的学生们。从描述来看,这份资料似乎是一份学习指南或者是考试复习资料的一部分,旨在帮助学生们更好地掌握Java编程的...

Global site tag (gtag.js) - Google Analytics