特此声明:因网友疑问,这里声明一个重要的安全,就是你们所知的java惊现0day漏洞!8月30日,Oralce紧急发布了新版本的JDK和JRE,缘由是发现了一个严重的0day漏洞CVE-2012-4681,远程攻击者能够经过它绕开SecurityManager的限制执行代码!国内的Freebuf在分析恶意代码时发现了其中有这样一段代码,即“我有一只小毛驴,历来也不骑”。html
String k1 = "woyouyizhixiaomaol"; String k2 = "conglaiyebuqi";
若是对该漏洞感兴趣的童鞋请点击(http://www.freebuf.com/vuls/5485.html国内、http://www.deependresearch.org/2012/08/java-7-vulnerability-analysis.html这个为国外分析)该漏洞通常针对的是applet,国内不多有这样的应用了!(即便有估计也没有几我的挖空心思搞你一个我的电脑!没意义!信息盗卖已经不是新闻了!)国外彷佛还有!建议在浏览器中使用Java的同窗马上将本身的Java升级到7u7或6u35版本。java
一:java7语言扩展的简介数据库
2011年7月,在时隔数年以后,java的一个重大版本javase7发布了。在这个新的版本中,java平台新增了不少的新的特性。在java虚拟机方面,invokedynamic指令的加入使虚拟机上的动态语言的性能获得了很大的提高。这使得开发人员能够享受到动态语言带来的在提升生产效率方面的好处。在java语言方面,语言自己的进一步简化,使开发人员编写代码的效率更高。在java类库方面,新的IO库和同步实现工具类为开发人员提供了更多的实现功能。从另一个角度来讲,javase7是oracle公司领导力的顾虑。Javase7的发布也证实了jcp和openjdk的社区驱动模式能够很好地推进java向前发展。数组
随着新版本的发布,确定会有愈来愈多的开发人员想尝试使用javase7中的新特性,毕竟开发者社区对这个新版本的期待了太长的时间。在java程序中使用这些新特性,能够提升代码质量,提高工做效率。Java平台的每一个版本都致力于提升java程序的运行性能。同时随着新版本的发布,企业都应该考虑把java程序的运行平台升级到最新的javase7,这样能够享受到性能提高所带来的好处。对于新的java程序开发,推荐使用javase7做为标准的运行平台。浏览器
在介绍具体的新特性以前,有必要介绍一下coin项目。OpenJDK中的Coin项目的目的是维护对java语言所作的语法加强。在Coin项目开始之初,曾经普遍地向社区征求提议。在短短一个月时间内就收到了近70条提议。最后有9条提议被列入考虑之中。在这9条提议中,有6条成为java7的一部分,剩下的6提议会在java8中从新考虑,还有1条提议被移到其余项目中实现。这6条被接纳的提议除了switch语句中使用字符串、数值字面的改进、优化的异常处理、try-with-resources语句和优化变长参数的方法调用以外还有简化泛型类建立的“<>”操做符。在java8中考虑2条提议则分别是集合类字面量和为List和Map提供相似数组的按序号的访问方式。安全
和其余对java平台所作的修改同样,Coin项目所建议的修改也须要经过JCP来完成。这些改动以JSR334(Small Enhancements to the Java)oracle
二:java7中 switch特性介绍app
今天首先来让咱们看看耳熟能详的switch是如何被提高扩展对字符串的支持的!你们都知道在java7以前switch语句中的条件表达式的类型只能是与整数类型兼容的类型,包括基本类型char、byte、short和int,与这些基本类型对应的封装类型Character、Byte、Short和Integer,还有枚举类型。这样的限制下降了语言的灵活性,使开发人员在须要根据其余类型的表达式来进行条件选择时,不得不增长额外的代码来绕过这个限制。为此java7放宽了这个限制,额外增长了一种能够在switch语句中使用的表达式类型,那就是很常见的字符串,即String类型eclipse
三:java7中switch用法模块化
在基本java7的代码中使用这个新特性很是简单,由于这个新特性并无改变switch的语法含义,只是多了一种开发人员能够选择的条件判断的数据类型。可是这个简单的新特性却带来了重大的影响,由于根据字符串进行条件判断在开发中是很常见的。
下面来看看java7中根据字符串进行条件判断【Test】:
public class Test { public String getTitle(String name,String sex){ String title =""; switch(sex){ case "男": title=name+"\t it man"; break; case "女": title=name+"\t it woman"; break; default: title=name+"变形金刚"; } return title; } public static void main(String[] args) { System.out.println(new Test().getTitle("Dobby", "男")); } }
运行结果:
PS:在switch语句中,表达式的值是不能是null,不然会在运行时抛出NullPointerException,在case子句中也不能使用null,不然会出现编译错误。
看到这里或许你以为这个没什么嘛就是一个简单的switch,你别着急接下来就是switch的深度历险了,让咱们看看他是如何实现switch接受String类型的!根据switch语句的语法要求,其case子句的值是不能重复的,这个要求对字符串类型的条件表达式一样适用。不过对于字符串来讲这种重复值的检查还有一个特殊之处,就是java代码中的字符串能够包含Unicode转义字符。重复值的检查是在java编译器对java源码进行相关的语法转换以后才进行的。这个语法转换过程当中包括了对Unicode转义字符的处理。也就是说,有些case子句的值虽然在源码中看起来是不一样的,可是通过转换后是同样的,这个就会形成编译错误。
修改上面的代码再执行看看以下修改(使用jdk自带的native2ascii.exe将“女”转换成Unicode):
public String getTitle(String name,String sex){ String title =""; switch(sex){ case "男": title=name+"\t it man"; break; case "\u7537": title=name+"\t it woman"; break; default: title=name+"变形金刚"; } return title; }
当咱们再次编译的时候就会不经过,报出标签重复错误!
这是由于其中的switch语句中的两个case子句所使用的值“男”和“\u7537”在通过转义以后变成同样的。“\u7537”是“男”的Unicode转义字符形式。
四.java7 switch实现原理
说了这么多下面让咱们来看看switch到底是如何实现的呢!实际上,这个新特性是在编译器这个层次上实现的。而在java虚拟机和字节码这个层次上,仍是只支持在switch语句中使用与整数类型兼容的类型。这么作的目的是为了减小这个特性所影响的范围,以下降实现的代价。在编译器层次实现的含义是,虽然开发人员在java源码的switch语句中使用了字符串类型,可是编译的过程当中,编译器会根据源代码的含义来进行转换,将字符串类型转换成与整数兼容的格式。不一样的java编译器可能采用不一样的方式来完成这个转换,并采用不一样的优化策略。好比:若是switch子句中只包含一个case子句,那么能够简单的将其转换成一个if语句。若是switch语句中包含一个case子句和一个default子句,那么能够将其转换成if-else语句。而对于最复杂的状况,只不过使用字符串的哈希值做为switch语句的表达式的值。
为了验证刚刚的理论同时咱们也探究OpenJDK中的java编译器使用的是什么样的转换方式,须要一个名为JAD的工具,这个工具能够把java的class文件反编译成java源码,下面咱们使用JAD把刚刚的Test.class文件反编译。在对编译生成Test类的class文件使用了JAD以后,所获得的内容以下:
从上面的代码中能够看出,原来用在switch语句中的字符串被替换成了对应的哈希值,而case子句的值也被替换成原来字符串经常使用的哈希值。通过这样的转换,java虚拟机所看到的仍然是与整数类型兼容的类型。在这里值得注意的是,在case子句对应的语句块中仍然须要使用String的equals方法来进行字符串比较。这是由于哈希函数在映射的时候可能存在冲突,多个字符串的哈希值多是同样的。进行字符串比较是为了保证转换以后的代码逻辑与以前彻底同样!
好了今日历险到此,java7里面的变革仍是很大的这里就先分享一则!后面基本分为有如下方面:
1. 语法新特性:对数值字面量的改进、优化的异常处理、try-with-resources语句、优化变长参数的方法调用、
2. Java语言的动态性:脚本语言支持API、反射API、动态代理、动态语言支持、
3. Java7其余重要更新:关系数据库访问、javalang包更新、java实用工具类、JavaBeans组件
4. 超越java7:lambda表达式、java平台模块化、javaSe8的其余更新
想必你们机子上必定更新到 java7 了吧!只是没有几我的用过吧!接下来就是本身动手历险的时候了!实践是检验真理的惟一标准!(若是没有的本身能够到 oracle 官方下载 java7 jdk )这里透露一下哦, eclipse 最新版也已经集成了 java7 能够到官方下载,不过默认的仍是 6 的版本,本身建立项目的时候能够选择,若是发现能够 jre 没有集成, 本身能够添加 java7 的 jre 到 eclipse 就可使用了!好了初试 java7 到此结束!后面慢慢在学习!