jdk1518的新特性Word文档格式.docx
《jdk1518的新特性Word文档格式.docx》由会员分享,可在线阅读,更多相关《jdk1518的新特性Word文档格式.docx(45页珍藏版)》请在冰点文库上搜索。
System.out.println(WeekDay.values().length);
newDate(300){};
}
publicenumWeekDay{
SUN
(1),MON(),TUE,WED,THI,FRI,SAT;
privateWeekDay(){System.out.println("
first"
);
privateWeekDay(intday){System.out.println("
second"
publicenumTrafficLamp{
RED(30){
publicTrafficLampnextLamp(){
returnGREEN;
}
},
GREEN(45){
returnYELLOW;
}
YELLOW(5){
returnRED;
};
publicabstractTrafficLampnextLamp();
privateinttime;
privateTrafficLamp(inttime){this.time=time;
3.静态导入
importstaticjava.lang.Math.*;
publicclassStaticImport{
publicstaticvoidmain(String[]args){
intx=1;
try{
x++;
}finally{
System.out.println("
template"
System.out.println(x);
System.out.println(max(3,6));
System.out.println(abs(3-6));
4.可变参数
publicclassVarableParameter{
System.out.println(add(2,3));
System.out.println(add(2,3,5));
publicstaticintadd(intx,int...args){
intsum=x;
/*
for(inti=0;
i<
args.length;
i++){
sum+=args[i];
}*/
for(intarg:
args){
sum+=arg;
returnsum;
5.内省
ReflectPointpt1=newReflectPoint(3,5);
BeanInfobeanInfo=Introspector.getBeanInfo(pt1.getClass());
PropertyDescriptor[]pds=beanInfo.getPropertyDescriptors();
ObjectretVal=null;
for(PropertyDescriptorpd:
pds){
MethodmethodGetX=pd.getReadMethod();
retVal=methodGetX.invoke(pt1);
jdk1.6新特性:
1.Web服务元数据
Java里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体系,由于变化很大,干脆将名字也重构为JavaEE,JavaEE(当前版本为5.0)将元数据纳入很多规范当中,这其中就包括WebServices的相关规范,加入元数据之后的WebServices服务器端编程模型就跟上面看到的C#片断差不多了,这显然比以前的JAX-RPC编程模型简单(当然,Axis的编程模型也很简单).这里要谈的Web服务元数据(JSR181)只是JavaWeb服务规范中的一个,它跟CommonAnnotations,JAXB2,StAX,SAAJ和JAX-WS等共同构成JavaEE5的WebServices技术堆栈.
packageWebServices;
importjava.io.File;
importjava.io.IOException;
importjavax.jws.Oneway;
importjavax.jws.WebMethod;
importjavax.jws.WebParam;
importjavax.jws.WebResult;
importjavax.jws.WebService;
importjavax.xml.ws.Endpoint;
*@authorchinajash
@WebService(targetNamespace="
publicclassWSProvider{
@WebResult(name="
Greetings"
)//自定义该方法返回值在WSDL中相关的描述
@WebMethod
publicStringsayHi(@WebParam(name="
MyName"
)Stringname){
return"
Hi,"
+name;
//@WebParam是自定义参数name在WSDL中相关的描述
@Oneway//表明该服务方法是单向的,既没有返回值,也不应该声明检查异常
@WebMethod(action="
printSystemTime"
operationName="
)//自定义该方法在WSDL中相关的描述
publicvoidprintTime(){
System.out.println(System.currentTimeMillis());
publicstaticvoidmain(String[]args){
ThreadwsPublisher=newThread(newWSPublisher());
wsPublisher.start();
privatestaticclassWSPublisherimplementsRunnable{
publicvoidrun(){
//发布WSProvider到http:
//localhost:
8888/chinajash/WSProvider这个地址,之前必须调用wsgen命令
//生成服务类WSProvider的支持类,命令如下:
//wsgen-cp.WebServices.WSProvider
Endpoint.publish("
http:
8888/chinajash/WSProvider"
newWSProvider());
如果想看到WebServicesEngine生成的WSDL文件是否遵守上面的元数据,我们没有必要将上面的WSProvider部署到支持JSR-181的应用服务器或Servlet形式的WebServicesEngine,现在JDK6已经提供了一个很简单的机制可以用来测试和发布WebServices,下面讲讲如何在JDK6环境下发布WebServices和查看生成的WSDL
1.将<
JDK_HOME>
/bin加入path环境变量
2.在命令行下切换当前目录到WSProvider的class文件所在的目录,运行下面命令
wsgen-cp.WebServices.WSProvider
在这个例子中会生成以下3个类的源代码文件及class文件
SayHi
SayHiResponse
PrintTime
3.执行如下代码发布WSProvider到http:
8888/chinajash/WSProvider,在这里可以执行WSProvider类的main方法就可以
Endpoint.publish("
4.在浏览器输入http:
8888/chinajash/WSProvider?
wsdl就可以看到生成的WSDL文件,为了节省篇幅,这里就不把生成的WSDL文件贴上了,大家可以自己动手试试.
2.脚本语言支持
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支持别的脚本语言,比如,你想让JDK6支持Ruby,那你可以自己按照JSR223的规范实现一个Ruby的脚本引擎类,具体一点,你需要实现javax.script.ScriptEngine(简单起见,可以继承javax.script.AbstractScriptEngine)和javax.script.ScriptEngineFactory两个接口。
当然,在你实现自己的脚本语言引擎之前,先到project这里看看是不是有人已经帮你做了工作,这样你就可以直接拿来用就行。
ScriptingAPI
---------------------------------------------------------------------
ScriptingAPI是用于在Java里面编写脚本语言程序的API,在Javax.script中可以找到ScriptingAPI,我们就是用这个API来编写JavaScript程序,这个包里面有一个ScriptEngineManager类,它是使用ScriptingAPI的入口,ScriptEngineManager可以通过jar服务发现(servicediscovery)机制寻找合适的脚本引擎类(ScriptEngine),使用ScriptingAPI的最简单方式只需下面三步
1、创建一个ScriptEngineManager对象
2、通过ScriptEngineManager获得ScriptEngine对象
3、用ScriptEngine的eval方法执行脚本
下面是一个HelloWorld程序
/***@authorchinajash*/
publicclassHelloScript{
publicstaticvoidmain(String[]args)throwsException{
ScriptEngineManagerfactory=newScriptEngineManager();
//step1
ScriptEngineengine=factory.getEngineByName("
JavaScript"
//Step2
engine.eval("
print('
Hello,Scripting'
)"
//Step3
}
运行上面程序,控制台会输出Hello,Scripting上面这个简单的Scripting程序演示了如何在Java里面运行脚本语言,除此之外,我们还可以利用ScriptingAPI实现以下功能1、暴露Java对象为脚本语言的全局变量2、在Java中调用脚本语言的方法3、脚本语言可以实现Java的接口4、脚本语言可以像Java一样使用JDK平台下的类下面的类演示了以上4种功能
packageScripting;
importjavax.script.Invocable;
importjavax.script.ScriptEngine;
importjavax.script.ScriptEngineManager;
importjavax.script.ScriptException;
publicclassScriptingAPITester{
ScriptEngineManagermanager=newScriptEngineManager();
ScriptEngineengine=manager.getEngineByName("
testScriptVariables(engine);
//演示如何暴露Java对象为脚本语言的全局变量
testInvokeScriptMethod(engine);
//演示如何在Java中调用脚本语言的方法
testScriptInterface(engine);
//演示脚本语言如何实现Java的接口
testUsingJDKClasses(engine);
//演示脚本语言如何使用JDK平台下的类
publicstaticvoidtestScriptVariables(ScriptEngineengine)throwsScriptException{
Filefile=newFile("
test.txt"
engine.put("
f"
file);
println('
TotalSpace:
'
+f.getTotalSpace())"
publicstaticvoidtestInvokeScriptMethod(ScriptEngineengine)throwsException{
Stringscript="
functionhello(name){return'
Hello,'
+name;
}"
;
engine.eval(script);
Invocableinv=(Invocable)engine;
Stringres=(String)inv.invokeFunction("
hello"
"
Scripting"
);
System.out.println("
res:
"
+res);
publicstaticvoidtestScriptInterface(ScriptEngineengine)throwsScriptException{
varobj=newObject();
obj.run=function(){println('
runmethodcalled'
}"
Objectobj=engine.get("
obj"
Invocableinv=(Invocable)engine;
Runnabler=inv.getInterface(obj,Runnable.class);
Threadth=newThread(r);
th.start();
publicstaticvoidtestUsingJDKClasses(ScriptEngineengine)throwsException{
//Packages是脚本语言里的一个全局变量,专用于访问JDK的package
Stringjs="
functiondoSwing(t){
varf=newPackages.javax.swing.JFrame(t);
f.setSize(400,300);
f.setVisible(true);
engine.eval(js);
inv.invokeFunction("
doSwing"
ScriptingSwing"
}ScriptingTool
--------------------------------------------------------------------------------
SUN提供的JDK6中有一个命令行工具?
?
jrunscript,你可以在<
JDK6_Home>
/bin下面找到这个工具,jrunscript是一个脚本语言的解释程序,它独立于脚本语言,但默认是用JavaScript,我们可以用jrunscript来测试自己写的脚本语言是否正确,下面是一个在命令行运行jrunscript的简单例子
jrunscript
js>
println("
Hello,JrunScript"
Hello,JrunScript
9*8
72.0
3.JTable的排序和过滤
原来的JTable基本上是只能显示数据,在JDK6新增了对JTable的排序和过滤功能,下面代码演示了这两个功能
publicclassJTableTester{
staticStringdata[][]={
{"
China"
"
Beijing"
Chinese"
},
America"
Washington"
English"
Korea"
Seoul"
Korean"
Japan"
Tokyo"
Japanese"
France"
Paris"
French"
England"
London"
Germany"
Berlin"
German"
},};
staticStringtitles[]={"
Country"
Capital"
Language"
};
publicstaticvoidmain(String[]args){
DefaultTableModelm=newDefaultTableModel(data,titles);
JTablet=newJTabl