Java6 JDK 16 新特性 总结大全 附代码.docx
- 文档编号:3526951
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:13
- 大小:62.26KB
Java6 JDK 16 新特性 总结大全 附代码.docx
《Java6 JDK 16 新特性 总结大全 附代码.docx》由会员分享,可在线阅读,更多相关《Java6 JDK 16 新特性 总结大全 附代码.docx(13页珍藏版)》请在冰豆网上搜索。
Java6JDK16新特性总结大全附代码
一:
Desktop类和SystemTray类
在JDK1.6中,AWT新增加了两个类:
Desktop和SystemTray。
Desktop:
Ø可以用来打开系统默认浏览器浏览指定的URL;
Ø打开系统默认邮件客户端给指定的邮箱发邮件;
Ø用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件);
Ø用系统默认的打印机打印文档;
SystemTray:
可以用来在系统托盘区创建一个托盘程序。
二:
使用JAXB2来实现对象与XML之间的映射
JAXB是JavaArchitectureforXMLBinding的缩写,可以将一个Java对象转变成为XML格式,反之亦然。
我们把对象与关系数据库之间的映射称为ORM,其实也可以把对象与XML之间的映射称为OXM(ObjectXMLMapping)。
原来JAXB是JavaEE的一部分,在JDK1.6中,SUN将其放到了JavaSE中。
JDK1.6中自带的这个JAXB版本是2.0,比起1.0(JSR31)来,JAXB2(JSR222)用JDK5的新特性Annotation来标识要作绑定的类和属性等,这就极大简化了开发的工作量。
三:
StAX解析xml
StAX(JSR173)是JDK1.6.0中除了DOM和SAX之外的又一种处理XML文档的API。
StAX是TheStreamingAPIforXML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;代码如下:
test.xml
xmlversion="1.0"encoding="UTF-8"?
>
源代码StaxTester.java
packagecom.test;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjavax.xml.namespace.QName;
importjavax.xml.stream.XMLEventReader;
importjavax.xml.stream.XMLInputFactory;
importjavax.xml.stream.XMLOutputFactory;
importjavax.xml.stream.XMLStreamException;
importjavax.xml.stream.XMLStreamWriter;
importjavax.xml.stream.events.StartElement;
importjavax.xml.stream.events.XMLEvent;
publicclassStaxTester{
publicstaticvoidmain(String[]args)throwsXMLStreamException,FileNotFoundException{
readXMLByStAX();//用XMLEventReader解析xml文档
writeXMLByStAX();//用XMLStreamWriter写xml文档
}
privatestaticvoidreadXMLByStAX()throwsXMLStreamException,FileNotFoundException{
XMLInputFactoryxmlif=XMLInputFactory.newInstance();
XMLEventReaderxmler=xmlif.createXMLEventReader(StaxTester.class.getResourceAsStream("test.xml"));
XMLEventevent;
StringBufferparsingResult=newStringBuffer();
while(xmler.hasNext()){
event=xmler.nextEvent();
if(event.isStartElement()){//如果解析的是起始标记
StartElementse=event.asStartElement();
parsingResult.append("<");
parsingResult.append(se.getName());
if(se.getName().getLocalPart().equals("catalog")){
parsingResult.append("id=\"");
parsingResult.append(se.getAttributeByName(newQName("id")).getValue());
parsingResult.append("\"");
}
parsingResult.append(">");
}elseif(event.isCharacters()){//如果解析的是文本内容
parsingResult.append(event.asCharacters().getData());
}elseif(event.isEndElement()){//如果解析的是结束标记
parsingResult.append("");
parsingResult.append(event.asEndElement().getName());
parsingResult.append(">");
}
}
System.out.println(parsingResult);
}
privatestaticvoidwriteXMLByStAX()throwsXMLStreamException,FileNotFoundException{
XMLOutputFactoryxmlof=XMLOutputFactory.newInstance();
XMLStreamWriterxmlw=xmlof.createXMLStreamWriter(newFileOutputStream("output.xml"));
//写入默认的XML声明到xml文档
xmlw.writeStartDocument();
xmlw.writeCharacters("\n");
//写入注释到xml文档
xmlw.writeComment("testingcomment");
xmlw.writeCharacters("\n");
//写入一个catalogs根元素
xmlw.writeStartElement("catalogs");
xmlw.writeNamespace("myNS","
xmlw.writeAttribute("owner","paraview");
xmlw.writeCharacters("\n");
//写入子元素catalog
xmlw.writeStartElement(""catalog");
xmlw.writeAttribute("id","007");
xmlw.writeCharacters("Apparel");
//写入catalog元素的结束标签
xmlw.writeEndElement();
//写入catalogs元素的结束标签
xmlw.writeEndElement();
//结束XML文档
xmlw.writeEndDocument();
xmlw.close();
}
}
控制台:
生成的output.xml
xmlversion="1.0"?
>
--testingcomment-->
myNS="owner="paraview"> catalogid="007">Apparel catalog> 四: 使用CompilerAPI 现在我们可以用JDK1.6的CompilerAPI(JSR199)去动态编译Java源文件,CompilerAPI结合反射功能就可以实现动态的产生Java代码并编译执行这些代码,有点动态语言的特征。 这个特性对于某些需要用到动态编译的应用程序相当有用,比如JSPWebServer,当我们手动修改JSP后,是不希望需要重启WebServer才可以看到效果的,这时候我们就可以用CompilerAPI来实现动态编译JSP文件,当然,现在的JSPWebServer也是支持JSP热部署的,现在的JSPWebServer通过在运行期间通过Runtime.exec或ProcessBuilder来调用javac来编译代码,这种方式需要我们产生另一个进程去做编译工作,不够优雅而且容易使代码依赖与特定的操作系统;CompilerAPI通过一套易用的标准的API提供了更加丰富的方式去做动态编译,而且是跨平台的。 五: 轻量级HttpServerAPI JDK1.6提供了一个简单的HttpServerAPI,据此我们可以构建自己的嵌入式HttpServer,它支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的HttpServerAPI来实现,程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,在这里,我们把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange传给HttpHandler实现类的回调方法。 例子如下: MyHttpServer.java packagecom.test; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStream; importjava.io.InputStreamReader; importjava.io.OutputStream; import.InetSocketAddress; import.httpserver.HttpExchange; import.httpserver.HttpHandler; import.httpserver.HttpServer; import.httpserver.spi.HttpServerProvider; publicclassMyHttpServer{ //启动服务,监听来自客户端的请求 publicstaticvoidhttpserverService()throwsIOException{ HttpServerProviderprovider=HttpServerProvider.provider(); HttpServerhttpserver=provider.createHttpServer(newInetSocketAddress(8888),100);//监听端口8888,能同时接受100个请求 httpserver.createContext("/myApp",newMyHttpHandler()); httpserver.setExecutor(null); httpserver.start(); System.out.println("serverstarted"); } //Http请求处理类 staticclassMyHttpHandlerimplementsHttpHandler{ publicvoidhandle(HttpExchangehttpExchange)throwsIOException{ StringresponseMsg="ok";//响应信息 InputStreamin=httpExchange.getRequestBody();//获得输入流 BufferedReaderreader=newBufferedReader(newInputStreamReader(in)); Stringtemp=null; while((temp=reader.readLine())! =null){ System.out.println("clientrequest: "+temp); } httpExchange.sendResponseHeaders(200,responseMsg.length());//设置响应头属性及响应信息的长度 OutputStreamout=httpExchange.getResponseBody();//获得输出流 out.write(responseMsg.getBytes()); out.flush(); httpExchange.close(); } } publicstaticvoidmain(String[]args)throwsIOException{ httpserverService(); } } Test.java packagecom.test; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStream; importjava.io.InputStreamReader; importjava.io.OutputStream; import.HttpURLConnection; import.URL; importjava.util.concurrent.ExecutorService; importjava.util.concurrent.Executors; publicclassTest{ publicstaticvoidmain(String[]args){ ExecutorServiceexec=Executors.newCachedThreadPool(); //测试并发对MyHttpServer的影响 for(inti=0;i<20;i++){ Runnablerun=newRunnable(){ publicvoidrun(){ try{ startWork(); }catch(IOExceptione){ e.printStackTrace(); } } }; exec.execute(run); } exec.shutdown();//关闭线程池 } publicstaticvoidstartWork()throwsIOException{ URLurl=newURL("http: //127.0.0.1: 8888/myApp"); HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection(); urlConn.setDoOutput(true); urlConn.setDoInput(true); urlConn.setRequestMethod("POST"); //测试内容包 Stringteststr="thisisatestmessage"; OutputStreamout=urlConn.getOutputStream(); out.write(teststr.getBytes()); out.flush(); while(urlConn.getContentLength()! =-1){ if(urlConn.getResponseCode()==200){ InputStreamin=urlConn.getInputStream(); BufferedReaderreader=newBufferedReader(newInputStreamReader(in)); Stringtemp=""; while((temp=reader.readLine())! =null){ System.err.println("serverresponse: "+temp);//打印收到的信息 } reader.close(); in.close(); urlConn.disconnect(); } } } } 六: 插入式注解处理API(PluggableAnnotationProcessingAPI) 插入式注解处理API(JSR269)提供一套标准API来处理Annotations(JSR175) JSR269用AnnotationProcessor在编译期间而不是运行期间处理Annotation,AnnotationProcessor相当于编译器的一个插件,所以称为插入式注解处理.如果AnnotationProcessor处理Annotation时(执行process方法)产生了新的Java代码,编译器会再调用一次AnnotationProcessor,如果第二次处理还有新代码产生,就会接着调用AnnotationProcessor,直到没有新代码产生为止.每执行一次process()方法被称为一个"round",这样整个Annotationprocessing过程可以看作是一个round的序列。 七: CommonAnnotations Commonannotations原本是JavaEE5.0(JSR244)规范的一部分,现在SUN把它的一部分放到了JavaSE6.0中。 随着Annotation元数据功能(JSR175)加入到JavaSE5.0里面,很多Java技术(比如EJB,WebServices)都会用Annotation部分代替XML文件来配置运行参数(或者说是支持声明式编程,如EJB的声明式事务),如果这些技术为通用目的都单独定义了自己的Annotations,显然有点重复建设,所以,为其他相关的Java技术定义一套公共的Annotation是有价值的,可以避免重复建设的同时,也保证JavaSE和JavaEE各种技术的一致性。 八: 用Console开发控制台程序 JDK1.6中提供了java.io.Console类专用来访问基于字符的控制台设备。 你的程序如果要与Windows下的cmd或者Linux下的Terminal交互,就可以用Console类代劳。 但我们不总是能得到可用的Console,一个JVM是否有可用的Console依赖于底层平台和JVM如何被调用。 如果JVM是在交互式命令行(比如Windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的Console实例。 九: 对脚本语言的支持 如: ruby,groovy,javascript。 JDK6增加了对脚本语言的支持(JSR223),原理上是将脚本语言编译成bytecode,这样脚本语言也能享用Java平台的诸多优势,包括可移植性,安全等,另外,由于现在是编译成bytecode后再执行,所以比原来边解释边执行效率要高很多。 加入对脚本语言的支持后,对Java语言也提供了以下好处。 1、许多脚本语言都有动态特性,比如,你不需要用一个变量之前先声明它,你可以用一个变量存放完全不同类型的对象,你不需要做强制类型转换,因为转换都是自动的。 现在Java语言也可以通过对脚本语言的支持间接获得这种灵活性。 2、可以用脚本语言快速开发产品原型,因为现在可以Edit-Run,而无需Edit-Compile-Run,当然,因为Java有非常好的IDE支持,我们完全可以在IDE里面编辑源文件,然后点击运行(隐含编译),以此达到快速开发原型的目的,所以这点好处基本上可以忽略。 3、通过引入脚本语言可以轻松实现Java应用程序的扩展和自定义,我们可以把原来分布在在Java应用程序中的配置逻辑,数学表达式和业务规则提取出来,转用JavaScript来处理。 Sun的JDK6实现包含了一个基于MozillaRhino的脚本语言引擎,支持JavaScript,这并不是说明JDK6只支持JavaScript,任何第三方都可以自己实现一个JSR-223兼容的脚本引擎使得JDK6支持别的脚本语言. 十: JavaDB与嵌入式数据库Derby 新安装了JDK6的程序员们也许会发现,除了传统的bin、jre等目录,JDK6新增了一个名为db的目录。 这便是Java6的新成员: JavaDB。 这是一个纯Java实现、开源的数据库管理系统(DBMS),源于Apache软件基金会(ASF)名下的项目Derby。 从Java6开始,应用程序不再需要显式地加载驱动程序了,DriverManager开始能够自动地承担这项任务。 Derby是IBM送给开源社区的又一个礼物,是一个purejava的数据库,现在已经被列入到java1.6中。 不知道对于大数据量的性能如何,但传说中启动derby只会给JVM添加2M的内存,对那些小数据库应用,比如像用access那种应该是挺有诱惑力的。 另外,功能要比access多得多,包括事务处理,并发,触
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java6 JDK 16 新特性 总结大全 附代码 特性 总结 大全 代码