【Java利器】JDK5-9新特性解析+代码 - JDK6

本文主要介绍JDK6的新特性。


目录

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

1.DestTop类和SystemTray类

前者用于调度操作系统中的一些功能,例如:

· 可以打开系统默认浏览器指定的URL地址;
· 打开系统默认邮件客户端给指定的邮箱发信息;
· 用默认程序打开或编辑文件;
· 用系统默认的打印机打印文档。

后者可用来在系统托盘区创建一个托盘程序。


package com.example.demo.jdk;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * Desktop类和SystemTray类
 *
 * @author yclimb
 * @date 2018/1/30
 */
public class DesktopTray {
    private static Desktop desktop;
    private static PopupMenu pm;

    /**
     * 主方法
     * @param args v
     */
    public static void main(String[] args) {
        // 判断当前平台是否支持Desktop类
        if (Desktop.isDesktopSupported()) {
            desktop = Desktop.getDesktop();
        }
        // 判断当前平台是否支持系统托盘
        if (SystemTray.isSupported()) {
            SystemTray st = SystemTray.getSystemTray();
            // 定义托盘图标的图片
            Image image = Toolkit.getDefaultToolkit().getImage("test.png");
            createPopupMenu();
            TrayIcon ti = new TrayIcon(image, "Desktop Demo Tray", pm);
            try {
                st.add(ti);
            } catch (AWTException ex) {
                ex.printStackTrace();
            }
        }
    }

    /**
     * 打开系统默认邮件客户端给指定的邮箱发邮件
     * @param mail 邮件地址
     */
    private static void sendMail(String mail) {
        if (desktop != null && desktop.isSupported(Desktop.Action.MAIL)) {
            try {
                desktop.mail(new URI(mail));
            } catch (IOException | URISyntaxException ex) {
                ex.printStackTrace();
            }
        }
    }

    /**
     * 打开系统默认浏览器浏览指定的URL
     * @param url 地址
     */
    private static void openBrowser(String url) {
        if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
            try {
                desktop.browse(new URI(url));
            } catch (IOException | URISyntaxException ex) {
                ex.printStackTrace();
            }
        }
    }

    /**
     * 编辑文件
     * @param filePath 文件路径
     */
    private static void edit(String filePath) {
        if (desktop != null && desktop.isSupported(Desktop.Action.EDIT)) {
            try {
                File txtFile = new File(filePath);
                if (!txtFile.exists()) {
                    txtFile.createNewFile();
                }
                desktop.edit(txtFile);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

    /**
     * 创建弹出菜单
     */
    private static void createPopupMenu() {
        pm = new PopupMenu();
        MenuItem openBrowser = new MenuItem("Open My Blog");
        openBrowser.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                openBrowser("http://blog.csdn.net/yclimb");
            }
        });

        MenuItem sendMail = new MenuItem("Send Mail to me");
        sendMail.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                sendMail("mailto:yclimb@qq.com");
            }
        });

        MenuItem edit = new MenuItem("Edit Text File");
        sendMail.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                edit("test.txt");
            }
        });

        MenuItem exitMenu = new MenuItem("&Exit");
        exitMenu.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        pm.add(openBrowser);
        pm.add(sendMail);
        pm.add(edit);
        pm.addSeparator();
        pm.add(exitMenu);
    }
}

2.使用JAXB2来实现对象与XML之间的映射

JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对象转变成为XML格式,反之亦然。我们把对象与关系数据库之间的映射称为ORM, 其实也可以把对象与XML之间的映射称为OXM(Object XML Mapping). 原来JAXB是Java EE的一部分,在JDK6中,SUN将其放到了Java SE中,这也是SUN的一贯做法。JDK6中自带的这个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文档。


public class JAXB2Tester {
    public static void main(String[] args) throws JAXBException,IOException {
        JAXBContext context = JAXBContext.newInstance(Person.class);
        //下面代码演示将对象转变为xml
        Marshaller m = context.createMarshaller();
        Address address = new Address("China","Beijing","Beijing","ShangDi West","100080");
        Person p = new Person(Calendar.getInstance(),"JAXB2",address,Gender.MALE,"SW");
        FileWriter fw = new FileWriter("person.xml");
        m.marshal(p,fw);

        //下面代码演示将上面生成的xml转换为对象
        FileReader fr = new FileReader("person.xml");
        Unmarshaller um = context.createUnmarshaller();
        Person p2 = (Person)um.unmarshal(fr);
        System.out.println("Country:"+p2.getAddress().getCountry());
    }
}

@XmlRootElement//表示person是一个根元素
class Person {    
    @XmlElement
    Calendar birthDay; //birthday将作为person的子元素

    @XmlAttribute
    String name; //name将作为person的的一个属性

    public Address getAddress() {
        return address;
    }

    @XmlElement
    Address address; //address将作为person的子元素

    @XmlElement
    Gender gender; //gender将作为person的子元素

    @XmlElement
    String job; //job将作为person的子元素

    public Person(){
    }

    public Person(Calendar birthDay, String name, Address address, Gender gender, String job) {
        this.birthDay = birthDay;
        this.name = name;
        this.address = address;
        this.gender = gender;
        this.job = job;
    }
}

enum Gender{
    MALE(true),
    FEMALE (false);
    private boolean value;
    Gender(boolean _value){
        value = _value;
    }
}

class Address {
    @XmlAttribute
    String country;
    @XmlElement
    String state;
    @XmlElement
    String city;
    @XmlElement
    String street;
    String zipcode; //由于没有添加@XmlElement,所以该元素不会出现在输出的xml中

    public Address() {
    }

    public Address(String country, String state, String city, String street, String zipcode) {
        this.country = country;
        this.state = state;
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }


    public String getCountry() {
        return country;
    }
}

运行该程序,我们会得到一个person.xml的文件,如下:


<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 

<person name="JAXB2">
      <birthDay>2018-01-28T08:49:27.203+00:00</birthDay> 
       <address country="China">
            <state>Beijing</state> 
            <city>Beijing</city> 
            <street>ShangDi West</street> 
  </address>
       <gender>MALE</gender> 
       <job>SW</job> 
</person>

控制台会输出:

Country:China

3.StAX

StAX是JDK1.6中除了DOM和SAX之外的又一种处理XML文档的API。

StAX是The Streaming API for XML的缩写。由于JDK6.0中的JAXB2和JAX-WS 2.0都会用到StAX,所以Sun决定把StAX加入到JAXP家族当中来,并将JAXP的版本升级到1.4.

JDK6里面JAXP的版本就是1.4。JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口。

博客地址

4.使用Complier API

现在我们可以用JDK1.6 的Compiler API动态编译Java源文件,Compiler API结合反射功能就可以实现动态的产生Java代码并编译执行这些代码,有点动态语言的特征。

这个特性对于某些需要用到动态编译的应用程序相当有用, 比如JSP Web Server,当我们手动修改JSP后,是不希望需要重启Web Server才可以看到效果的,这时候我们就可以用Compiler API来实现动态编译JSP文件。

博客地址

5.轻量级的Http Server API

JDK6 提供了一个简单的Http Server API,据此我们可以构建自己的嵌入式Http Server,它支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server API来实现。

博客地址

6.插入式注解处理API(Pluggable Annotation Processing API)

JSR (JSR是Java Specification Requests的缩写,意思是Java 规范请求)用Annotation Processor在编译期间而不是运行期间处理Annotation, Annotation Processor相当于编译器的一个插件,所以称为插入式注解处理。

博客地址

7.用Console开发控制台程序

JDK6中提供了java.io.Console 类专用来访问基于字符的控制台设备. 你的程序如果要与Windows下的cmd或者Linux下的Terminal交互,就可以用Console类代劳。

博客地址

8.对脚本语言的支持

如: ruby, groovy, javascript

博客地址

9.Common Annotations

Common annotations原本是Java EE 5.0规范的一部分,现在SUN把它的一部分放到了Java SE 6.0中. 随着Annotation元数据功能加入到Java SE 5.0里面,很多Java 技术(比如EJB,Web Services)都会用Annotation部分代替XML文件来配置运行参数,保证Java SE和Java EE 各种技术的一致性.。

博客地址

本篇文章到此就结束了,下一篇是JDK7的新特性总结,有问题请大神留言,欢迎交流!

扫描下面二维码,关注我的公众号哦!!!


关注我的公众号


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值