- 浏览: 7326052 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
Java™ 5 添加了许多强大的语言特性:泛型、枚举、注释、自动装箱和增强的 for
循环。
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
循环有时叫做 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 的整数),由于消除了冗余的实例化,可能会提高性能。而且,就像 Iterable
和 Enum
一样,valueOf()
方法在 JDK 1.4 类库中也不存在。
当编译器遇到用变长参数列表定义的方法时,会把其转换成包含正确组件类型数组的方法;当编译器遇到带有变长参数列表方法的调用时,就把参数装进数组。
定义了注释的之后,可以用 @Retention
对它进行注释,它可以决定编译器对使用这个注释的类、方法或字段执行什么处理。已经定义的保持策略有 SOURCE
(在编译时舍弃注释数据)、CLASS
(在类文件中记录注释)或 RUNTIME
(在类文件中记录注释,并在运行时保留注释,这样就可以反射地访问它们了)。
在 Java 5 之前,当编译器遇到尝试连接两个字符串的情况时,会使用帮助器类 StringBuffer
执行连接。在 Java 5 及以后的版本中,转而调用新的 StringBuilder
类,JDK 1.4 及以前的类库中不存在该类。
因为语言特性对库支持的依赖,即使使用 Java 5 编译器生成的类文件能够装入早期 JVM 版本,执行也会因为类装入错误而失败。但是,通过对字节码进行适当转换,仍有可能解决这些问题,因为这些遗漏的类并不包含实际的新功能。
在 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 循环的代码,这对多数项目来说可能足够了。这很方便,如果不支持的话,编译器会一次生成基本兼容的字节码。
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
的类,或者调用它的方法以使用自己的版本。
正如在开源世界中经常发生的,如果一个项目停止发展,无疑说明它已经失败,一个新项目会取代它的位置,即使它只是在休息。这就是 Retroweaver 的命运;它的主要维护者中断了项目,另一个类似项目 Retrotranslator 就取代了它的位置。Retrotranslator 提供了与 Retroweaver 相同的特性,外加许多额外特性,目标是支持 Java 5 中添加的重要类库:
- 把对
java.util.concurrent
类的调用替换成开源 JDK 1.4 backport 中对应的类。
- 提供了添加到 Java 5 集合框架中的特性的实现,例如
Arrays
和Collections
中的新方法。类似的,还提供了添加到 Java 5 类库的其他新方法和类的实现。
- 支持注释的运行时反射。
Retroweaver 和 Retrotranslator 都能静态地(在编译时)或动态地(在类装入时)执行它们的字节码转换。
有多种方法可以使他们使用 Java 5 的一些语言特性,同时保持与 JDK 1.4 及以前版本的字节码兼容性。javac
中不支持的 -target jsr14
选项可以为某些 Java 5 语言特性生成与 JDK 1.4 兼容的字节码,并且开源的 Retroweaver 和 Retrotranslator 项目能把多数 Java 5 字节码转换成与 Java 1.4 兼容的字节码。当然,不论选择哪种方式,都不要忘记仔细地进行测试,以验证其确实兼容。
发表评论
-
【转】Coherence Event Processing by using Map Trigger Feature
2013-06-25 14:02 2077This article shows how to proc ... -
【转】Distributed Data Management in Oracle Coherence
2013-06-25 13:55 1888This article shows how to prov ... -
【转】How to distribute Spring Beans by using Coherence
2013-06-21 17:24 1962转载自: http://www.onli ... -
关于H2使用的那些事
2012-12-14 16:40 27164在项目中采用H2作为工 ... -
【转】ConcurrentHashMap之实现细节
2012-12-10 14:32 1767Conc ... -
【转】Java并发编程J.U.C之Condition
2012-12-10 13:14 1903转载自http://www.golde ... -
【转】Java并发编程J.U.C之锁的获取与释放
2012-12-10 13:07 1611转载自 http://www.g ... -
【转】JUC 基础内容概述
2012-12-10 13:01 2042Concurrent Programming in Jav ... -
【转】Java并发编程之ConcurrentHashMap
2012-12-10 12:56 1772ConcurrentHashMap Conc ... -
【转】单例模式完全解析
2012-12-07 12:58 1698本文将探讨单例模式的各种情况,并给出相应的建议。 单例模式应该 ... -
【转】JAVA并发容器代码随读
2012-12-06 15:29 2943转载自 http://rdc.taobao.c ... -
【转】Spring 事务管理高级应用难点剖析:
2012-12-04 16:29 2219转载自 http://www.ibm.com/deve ... -
【转】Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式
2012-12-04 15:11 4475转载自 http://downpour.ite ... -
Hibernate延迟加载和OpenSessionInView
2012-12-03 17:13 3165ThreadLocal& ... -
关于ThreadLocal分析和总结
2012-12-03 15:56 1856什么是ThreadLocal? ... -
【转】java线程阻塞中断和LockSupport的常见问题
2012-12-03 13:30 1788转载自 http://www.iteye ... -
java 中 ReentrantReadWriteLock的读锁和写锁的使用
2012-11-30 17:14 10434jdk文档中关于Reentr ... -
java 多线程中Semaphore信号量
2012-11-30 15:39 3748Semaphore信号量: 可以维护当前 ... -
Java 文件锁的使用
2012-11-30 13:21 4425多线程-内部锁、重进入 多线程 ... -
【转】线程安全与锁优化
2012-11-29 16:17 1880转载自http://xussen.iteye.com/blo ...
相关推荐
### Java语言的特点 Java作为一款跨平台、面向对象的编程语言,在软件开发领域拥有着广泛的应用。本文将根据提供的文件信息来深入解析Java语言的主要特点。 #### 一、简单性与面向对象 Java的设计初衷是简化C++的...
本文将详细探讨Java语言的主要特点,以及它在实际计算机软件开发中的应用。 首先,Java编程语言的特点是语法结构简单。它的语法设计尽量简化,避免了诸如复杂的运算符和循环嵌套等可能导致编程错误的设计,这使得...
关于Java语言的特性.exe 详细精彩的介绍了关于java语言的特性,非常值得学习
java的特性 用于新手学习java 了解java的好帮手
5. Java编程语言与C++的关系:文档中出现了Java和C++的比较,体现了Java语言在设计上受到了C++的影响,但Java语言设计者有意避免了一些C++中的复杂性,例如指针和内存管理的复杂操作。 6. Java中类的定义:文档提及...
《面向对象程序设计JAVA语言程序设计》 以下是从给定的文件信息中生成的相关知识点: 1. Java 语言程序设计的基础知识点: * 面向对象程序设计的概念和特点 * Java 语言的特点和优势 * Java 语言的基本结构和组成...
该规范针对每一项语言特性都给出了代表性的示例程序,以帮助读者更容易地理解和掌握这些特性。通过阅读本规范,可以全面系统地了解Java语言的各项特性,为充分利用这些特性来编写出更加高效简洁的Java租序提供帮助。...
综上所述,JAVA编程语言凭借其强大的语言特性,在计算机软件安全开发中占据着不可替代的地位。通过利用JAVA的多线程、面向对象编程、JDBC和Annotation等技术,可以设计和开发出更加安全可靠、功能强大的软件产品。...
Java语言程序设计是指使用Java语言进行程序设计的过程,涵盖了Java语言的基本概念、语法、特性和应用。Java语言是由Sun Microsystems公司开发的一种高级语言,具有平台无关、对象oriented、安全性强等特点。 Java...
* 对象oriented:Java 语言是一种基于对象的程序设计语言,支持面向对象编程的所有特点。 * 高效性:Java 语言具有很高的执行效率,适合开发大型应用程序。 * 安全性:Java 语言具有很高的安全性,能够保护用户的...
第7章 Java语言类的特性(第7版)第7章 Java语言类的特性(第7版)第7章 Java语言类的特性(第7版)第7章 Java语言类的特性(第7版)第7章 Java语言类的特性(第7版)第7章 Java语言类的特性(第7版)第7章 Java语言类的特性(第7...
* 可移植性(Portable):Java语言的最大特点是“一次编程,处处运行”。 * 高性能(High performance):Java语言的字节码与机器码十分接近,使得字节码到机器码的转换十分快捷。 * 多线程(Multithreaded):Java...
1.1 指出JAVA语言的主要特点和JAVA程序的执行过程。 5 1.2 说出开发与运行JAVA程序的重要步骤。 5 1.3 如何区分应用程序和小应用程序? 5 1.4 说出JAVA源文件的命名规则。 5 1.6 JAVA语言使用什么字符集?共有多少个...
Java语言的特点包括: 1. **面向对象**:Java是一个完全面向对象的编程语言,支持类、接口和继承等面向对象特性,使得代码结构清晰,易于维护和扩展。 2. **简单性**:Java的设计目标之一是简化C++的复杂性,去除...
自从Java语言诞生以来,其简单易学、跨平台的特性,以及不断更新的技术支持,使得Java成为许多企业和开发者首选的编程语言。 Java编程语言的含义和特征是本次分析的重点。首先,Java语言是在C/C++等传统编程语言的...
- **Java语言的关键特点**:详细介绍Java的面向对象、简单高效、与平台无关等核心特点。 - **Java语言的主要应用方向**:概述Java在不同领域的应用场景,如Web开发、移动应用开发(Android)、企业级应用等。 ###...
在《Java语言程序设计》的源代码中,你可以找到各种示例,涵盖了从基础语法到高级特性的广泛内容,如: 1. **基本语法**:包括变量、数据类型、运算符、流程控制(if语句、switch语句、循环)、方法定义等。 2. **...
通过这些源代码,学习者可以更直观地理解Java语言的高级特性,并且通过实际动手操作,提升解决问题的能力。这是一份宝贵的资源,对于想要深入学习和研究Java的程序员来说,是一份不可多得的学习资料。
根据给定的信息,“Java语言程序设计”这一课程主要面向的是中国石油大学(北京)远程教育学院的学生们。从描述来看,这份资料似乎是一份学习指南或者是考试复习资料的一部分,旨在帮助学生们更好地掌握Java编程的...