zoukankan      html  css  js  c++  java
  • jdk 1.6 & 1.7新特性

    jdk1.6新特性
    1.Desktop类和SystemTray类
    2.使用JAXB2来实现对象与XML之间的映射
    3.StAX
    4.使用Compiler API
    5.轻量级Http Server API
    6.插入式注解处理API(Pluggable Annotation Processing API)
    7.用Console开发控制台程序
    8.对脚本语言的支持
    9.Common Annotations

    1.Desktop类和SystemTray类
    在JDK1.6中,AWT新增加了两个类:Desktop和SystemTray.
    前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印机打印文档;后者可以用来在系统托盘区创建一个托盘程序.

    2.使用JAXB2来实现对象与XML之间的映射
    JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对象转变成为XML格式,反之亦然.
    我们把对象与关系数据库之间的映射称为ORM,其实也可以把对象与XML之间的映射称为OXM(Object XML Mapping).原来JAXB是Java EE的一部分,在JDK1.6中,SUN将其放到了Java SE中,这也是SUN的一贯做法.JDK1.6中自带的这个JAXB版本是2.0,比起1.0(JSR 31)来,JAXB2(JSR 222)用JDK5的新特性Annotation来标识要作绑定的类和属性等,这就极大简化了开发的工作量.实际上,在Java EE 5.0中,EJB和Web Services也通过Annotation来简化开发工作.另外,JAXB2在底层是用StAX(JSR 173)来处理XML文档.除了JAXB之外,我们还可以通过XMLBeans和Castor等来实现同样的功能.

    3.StAX
    StAX(JSR 173)是JDK1.6.0中除了DOM和SAX之外的又一种处理XML文档的API.
    StAX 的来历:在JAXP1.3(JSR 206)有两种处理XML文档的方法:DOM(Document Object Model)和SAX(Simple API for XML).
    JDK1.6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR 224)都会用到StAXSun决定把StAX加入到JAXP家族当中来,并将JAXP的版本升级到1.4(JAXP1.4是JAXP1.3的维护版本).JDK1.6里面JAXP的版本就是1.4.
    StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;
    SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能.

    4.使用Compiler API
    现在我 们可以用JDK1.6 的Compiler API(JSR 199)去动态编译Java源文件,Compiler API结合反射功能就可以实现动态的产生Java代码并编译执行这些代码,有点动态语言的特征.
    这个特性对于某些需要用到动态编译的应用程序相当有用,比如JSP Web Server,当我们手动修改JSP后,是不希望需要重启Web Server才可以看到效果的,这时候我们就可以用Compiler API来实现动态编译JSP文件,当然,现在的JSP Web Server也是支持JSP热部署的,现在的JSP Web Server通过在运行期间通过Runtime.exec或ProcessBuilder来调用javac来编译代码,这种方式需要我们产生另一个进程去做编译工作,不够优雅容易使代码依赖与特定的操作系统;Compiler API通过一套易用的标准的API提供了更加丰富的方式去做动态编译,是跨平台的.

    5.轻量级Http Server API
    JDK1.6 提供了一个简单的Http Server API,据此我们可以构建自己的嵌入式Http Server,它支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server API来实现,程序员自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,在这里,我们把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange传给HttpHandler实现类的回调方法.

    6.插入式注解处理API(Pluggable Annotation Processing API)
    插入式注解处理API(JSR 269)提供一套标准API来处理Annotations(JSR 175)
    实际上JSR 269不仅仅用来处理Annotation,我觉得更强大的功能是它建立了Java 语言本身的一个模型,它把method,package,constructor,type,variable, enum,annotation等Java语言元素映射为Types和Elements(两者有什么区别?),从而将Java语言的语义映射成为对象,我们可以在javax.lang.model包下面可以看到这些类. 我们可以利用JSR 269提供的API来构建一个功能丰富的元编程(metaprogramming)环境.
    JSR 269用Annotation Processor在编译期间而不是运行期间处理Annotation,Annotation Processor相当于编译器的一个插件,称为插入式注解处理.如果Annotation Processor处理Annotation时(执行process方法)产生了新的Java代码,编译器会再调用一次Annotation Processor,如果第二次处理还有新代码产生,就会接着调用Annotation Processor,直到没有新代码产生为止.每执行一次process()方法被称为一个"round",这样整个Annotation processing过程可以看作是一个round的序列.
    JSR 269主要被设计成为针对Tools或者容器的API. 举个例子,我们想建立一套基于Annotation的单元测试框架(如TestNG),在测试类里面用Annotation来标识测试期间需要执行的测试方法.

    7.用Console开发控制台程序
    JDK1.6中提供了java.io.Console 类专用来访问基于字符的控制台设备.你的程序如果要与Windows下的cmd或者Linux下的Terminal交互,就可以用Console类代劳.但我们不总是能得到可用的Console,一个JVM是否有可用的Console依赖于底层平台和JVM如何被调用.如果JVM是在交互式命令行(比如Windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的Console实例.

    8.对脚本语言的支持
    如: ruby,groovy,javascript

    9.Common Annotations
    Common annotations原本是Java EE 5.0(JSR 244)规范的一部分,现在SUN把它的一部分放到了Java SE 6.0中.
    随着Annotation元数据功能(JSR 175)加入到Java SE 5.0里面,很多Java 技术(比如EJB,Web Services)都会用Annotation部分代替XML文件来配置运行参数(或者说是支持声明式编程,如EJB的声明式事务),如果这些技术为通用目的都单独定义了自己的Annotations,显然有点重复建设,,为其他相关的Java技术定义一套公共的Annotation是有价值的,可以避免重复建设的同时,也保证Java SE和Java EE 各种技术的一致性.
    下面列举出Common Annotations 1.0里面的10个Annotations Common Annotations Annotation Retention Target Description Generated Source ANNOTATION_TYPE,CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE 用于标注生成的源代码Resource Runtime TYPE,METHOD,FIELD用于标注所依赖的资源,容器据此注入外部资源依赖,有基于字段的注入和基于setter方法的注入两种方式Resources Runtime TYPE同时标注多个外部依赖,容器会把所有这些外部依赖注入PostConstruct Runtime METHOD标注当容器注入所有依赖之后运行的方法,用来进行依赖注入后的初始化工作,只有一个方法可以标注为PostConstruct PreDestroy Runtime METHOD当对象实例将要被从容器当中删掉之前,要执行的回调方法要标注为PreDestroy RunAs Runtime TYPE用于标注用什么安全角色来执行被标注类的方法,这个安全角色和Container的Security角色一致的.RolesAllowed Runtime TYPE,METHOD用于标注允许执行被标注类或方法的安全角色,这个安全角色和Container的Security角色一致的PermitAll Runtime TYPE,METHOD允许所有角色执行被标注的类或方法DenyAll Runtime TYPE,METHOD不允许任何角色执行被标注的类或方法,表明该类或方法不能在Java EE容器里面运行DeclareRoles Runtime TYPE用来定义可以被应用程序检验的安全角色,通常用isUserInRole来检验安全角色.


    jdk7新特性:
    1 对集合类的语言支持;
    2 自动资源管理;
    3 改进的通用实例创建类型推断;
    4 数字字面量下划线支持;
    5 switch中使用string;
    6 二进制字面量;
    7 简化可变参数方法调用。

    1 对集合类的语言支持 (没有实现)
    Java将包含对创建集合类的第一类语言支持。这意味着集合类的创建可以像Ruby和Perl那样了。
    原本需要这样:
    List<String> list = new ArrayList<String>();
    list.add("item");
    String item = list.get(0);

    Set<String> set = new HashSet<String>();
    set.add("item");
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("key", 1);
    int value = map.get("key");

    现在你可以这样:
    List<String> list = ["item"];
    String item = list[0];

    Set<String> set = {"item"};

    Map<String, Integer> map = {"key" : 1};
    int value = map["key"];

    这些集合是不可变的。


    2 自动资源管理
    Java中某些资源是需要手动关闭的,如InputStream,Writes,Sockets,Sql classes等。这个新的语言特性允许try语句本身申请更多的资源,
    这些资源作用于try代码块,并自动关闭。
    这个:
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
    return br.readLine();
    } finally {
    br.close();
    }

    变成了这个:
    try (BufferedReader br = new BufferedReader(new FileReader(path)) {
    return br.readLine();
    }

    你可以定义关闭多个资源:
    try (
    InputStream in = new FileInputStream(src);
    OutputStream out = new FileOutputStream(dest))
    {
    // code
    }
    为了支持这个行为,所有可关闭的类将被修改为可以实现一个Closable(可关闭的)接口。


    3 增强的对通用实例创建(diamond)的类型推断
    类型推断是一个特殊的烦恼,下面的代码:
    Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

    通过类型推断后变成:
    Map<String, List<String>> anagrams = new HashMap<>();
    这个<>被叫做diamond(钻石)运算符,这个运算符从引用的声明中推断类型。


    4 数字字面量下划线支持
    很长的数字可读性不好,在Java 7中可以使用下划线分隔长int以及long了,如:
    int one_million = 1_000_000;
    运算时先去除下划线,如:1_1 * 10 = 110,120 – 1_0 = 110


    5 switch中使用string
    以前你在switch中只能使用number或enum。现在你可以使用string了:
    String s = ...
    switch(s) {
    case "quux":
    processQuux(s);
    // fall-through
    case "foo":
    case "bar":
    processFooOrBar(s);
    break;
    case "baz":
    processBaz(s);
    // fall-through
    default:
    processDefault(s);
    break;
    }


    6 二进制字面量
    由于继承C语言,Java代码在传统上迫使程序员只能使用十进制,八进制或十六进制来表示数(numbers)。
    由于很少的域是以bit导向的,这种限制可能导致错误。你现在可以使用0b前缀创建二进制字面量:
    int binary = 0b1001_1001;
    现在,你可以使用二进制字面量这种表示方式,并且使用非常简短的代码,可将二进制字符转换为数据类型,如在byte或short。
    byte aByte = (byte)0b001;
    short aShort = (short)0b010;


    7 简化的可变参数调用
    当程序员试图使用一个不可具体化的可变参数并调用一个*varargs* (可变)方法时,编辑器会生成一个“非安全操作”的警告。
    JDK 7将警告从call转移到了方法声明(methord declaration)的过程中。这样API设计者就可以使用vararg,因为警告的数量大大减少了。


    你要坚强,坚强的足以认识自己的弱点;你要勇敢,勇敢的足以面对自己的恐惧;你要堂堂正正。在遇到挫折时能够昂首而不背躬屈膝;你要能够面对掌声,在胜利时能够谦逊而不趾高气扬。真正的伟大直率真诚,真正的贤人虚怀若谷,真正的强者温文尔雅。——萨利·布什(林肯的继母教育林肯)
  • 相关阅读:
    Centos7下部署两套python版本并存
    运维监控系统之Open-Falcon
    Linux下如何查看系统启动时间和运行时间以及安装时间
    linux下使用FreeRDP 连接 Windows 远程桌面
    python3.6环境部署文档
    应用Fiddler对手机应用来抓包
    Highcharts 向下钻取饼图
    Highcharts 散点图
    IntelliJ IDEA2017 激活方法
    iterable 类型
  • 原文地址:https://www.cnblogs.com/jinhuazhe2013/p/4148019.html
Copyright © 2011-2022 走看看