Java SE 6特性 Sun Microsystems
升级到Java SE 6的十大理由 简单的Web Service开发 脚本语言的集成 JDBC 4.0和内嵌Java DB 新的桌面开发API JMX扩展和一系列管理监控工具 访问Javac编译器的编程接口 Annotation处理器插件接口 新的安装下载界面,更好的Native Look&Feel支持
升级到Java SE 6的十大理由(续) 提供PKI, Java GSS, Kerberos, LDAP服务 支持 更好的性能和稳定性
Web Service开发 JAX-WS 2.0 JAXB 2.0 SAAJ 3.0
Web Service开发 package hello; import javax.jws.WebService; @WebService public class CircleFunctions { public double getArea(double radius) { return java.lang.Math.PI * (r * r); } public double getCircumference(double radius) { return 2 * java.lang.Math.PI * r;
Web Service开发 package hello; import javax.jws.WebService; @WebService public class CircleFunctions { public double getArea(double radius) { return java.lang.Math.PI * (r * r); } public double getCircumference(double radius) { return 2 * java.lang.Math.PI * r;
Web Service开发 生成相关Stub等文件 wsgen工具 部署创建的Web Service import javax.xml.ws.Endpoint; public static void main(String[] args) { Endpoint.publish( "http://localhost:8080/WebServiceExample/circlefunctions", new CircleFunctions()); }
脚本语言的集成 Java不仅是一种语言,同时是一个平台 VM 核心Java类库 对其它语言的支持JSR-223 插件式的脚本语言引擎 javax.script包
脚本集成API 脚本引擎 ScriptContext, Bindings ScriptEngineFactory ScriptEngineManager
脚本引擎 ScriptEngine接口(必须) 运行脚本文件eval()方法 将Java对象映射到脚本变量(put()方法) Invocable接口(可选) 调用脚本方法/函数 通过脚本方法实现Java接口 Compilable接口(可选) 把脚本编译成为中间结果,多次执行
ScriptContext, Bindings Binding是Map<String, Object>的子类型 引擎范围的Binding 脚本变量=>宿主程序对象 全局Binding 在多个引擎间共享
ScriptEngineFactory 与ScriptEngine一一对应 Factory方法:getScriptEngine() 其它方法 脚本文件扩展名 脚本引擎版本 ......
ScriptEngineManager 实体类 脚本引擎查找 Jar文件的META-INF/services机制 文件后缀名 脚本语言名称 指定类型装载器的查找 绑定全局Binding
例程——HelloWorld import javax.script.*; public class Main { public static void main(String[] args) throws ScriptException { // create a script engine manager ScriptEngineManager factory = new ScriptEngineManager(); // create JavaScript engine ScriptEngine engine=factory.getEngineByName("JavaScript"); // evaluate JavaScript code from String engine.eval("print('hello world')"); }
例程——从文件运行脚本 // create script engine manager ScriptEngineManager manager = new ScriptEngineManager(); // create JavaScript engine ScriptEngine engine = manager.getEngineByName(“JavaScript”); // evaluate a file (or any java.io.Reader) engine.eval(new FileReader(“test.js”));
例程——脚本变量 // create script engine manager ScriptEngineManager manager = new ScriptEngineManager(); // create JavaScript engine ScriptEngine engine = manager.getEngineByName(“JavaScript”); File f = new File(“test.txt”); // expose File object as variable to script engine.put(“file”, f); // evaluate a script string // script accesses “file” variable and calls method on it engine.eval(“print(file.getAbsolutePath())”);
例程——调用脚本方法 // JavaScript code in a String String script = "function hello(name) { print('Hello, ' + name); }"; // evaluate script engine.eval(script); // JavaScript engine implements Invocable interface Invocable inv = (Invocable) engine; // invoke a global function called “hello” inv.invoke("hello", new Object[] {"Scripting!!"} );
例程——脚本实现Java接口 // JavaScript code in a String String script = "function run() { print('run called\n'); }"; // evaluate script engine.eval(script); // JavaScript engine implements Invocable interface Invocable inv = (Invocable) engine; Runnable r = inv.getInterface(Runnable.class); r.run();
JDBC 4.0和内嵌JavaDB private Connection connect(String user, String passwd) throws SQLException { String url = "jdbc:mysql://javadb.sfbay/jplan"; String driver = "com.mysql.jdbc.Driver"; try { Class.forName(driver); return DriverManager.getConnection(url, user, passwd); } catch (ClassNotFoundException x) { throw new SQLException("Can't load Driver " + x); }
JDBC 4.0和内嵌JavaDB private Connection connect(String user, String passwd) throws SQLException { String url = "jdbc:mysql://javadb.sfbay/jplan"; String driver = "com.mysql.jdbc.Driver"; try { Class.forName(driver); return DriverManager.getConnection(url, user, passwd); } catch (ClassNotFoundException x) { throw new SQLException("Can't load Driver " + x); }
新的桌面API Splash屏幕 JTable排序过滤 SwingWorker Desktop API
Splash屏幕 命令行参数 Java -splash:hello.png HelloWorld Jar文件中参数设置 SplashScreen-Image: MyImage.png 在程序中通过SplashScreen类访问图形上下 文 SplashScreen.getSplashScreen() Graphics2D createGraphics()
JTable排序过滤 根据TableModel创建Sorter,然后将Sorter设置 到Table中 //create JTable JTable table = new Jtable(model); //create RowSorter RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); //set Sorter table.setRowSorter(sorter);
JTable排序过滤 通过向TableRowSorter设置RowFilter来实现对 于JTable和JList的过滤 andFilter orFilter dateFilter notFilter numberFilter regexFilter
SwingWorker Swing的事件分派线程负责所有事件的调度 和响应 费时的工作应该放在子线程中完成而不阻塞 事件分派 doInBackground():后台处理函数,负责 处理较为复杂的计算 FirePropertyChange():通知监听的线程 状态变化 execute():从Worker线程上启动任务
SwingWorker final JLabel label; class MeaningOfLifeFinder extends SwingWorker<String, Object> { @Override public String doInBackground() { return findTheMeaningOfLife(); } protected void done() { try { label.setText(get()); } catch (Exception ignore) { (new MeaningOfLifeFinder()).execute();
Desktop API 在java程序中启动系统本地的应用程序 浏览器,Email客户端,打印 //get Desktop instance Desktop desktop = Desktop.getDesktop(); //launch system browser with URI desktop.browse(new URI("http://www.sun.com")); //launch mail client with an email address filled //in desktop.mail(new URI("mailto:joey.shen@sun.com"));
为应用程序创建TrayIcon TrayIcon创建时的三个参数 TrayIcon icon = new TrayIcon(img, "My App", popmenu); 图标 ToolTip显示 弹出菜单 创建一个ActionListener icon.addActionListener(myListener); 将创建的TrayIcon加入到系统的Tray中 SystemTray tray = SystemTray.getSystemTray(); tray.add(icon);
JMX扩展和检测管理工具 MXBean CompositeData对于复杂属性的自动包装 Descriptors 关于得到各属性的附加信息 各种工具用于监测管理JVM和应用程序的运 行状况 基于JMX: Jconsole 基于JVMTI: jmp,hotspot provider
JConsole 通用的JMX客户端 连接本地和远程的JVM实例 监视和管理系统信息 内存使用情况 线程运行情况,死锁检测 类的装载和卸载 系统中各种MBean和MXBean提供的属性和 操作
Jps, Jinfo, Jstat JPS:列出所有Java进程和ID $jps -l | -m $jps -v | -V Jinfo: 得到或改变某一个Java进程运行参 数和系统属性(在Windows上功能有限) $jps -flags [jid] $jps -sysprops [jid] Jstat: 统计JVM运行过程中的各种信息 $jstat -gcutil [jid]
HPROF – Heap Profiler 作为JVMTI的一个演示程序,源代码在 <JAVA_HOME>/demo/jvmti/hprof下 观测Heap内存分配 $java -agentlib:hprof=heap=sites <Program> $java -agentlib:hprof=heap=dump <Program> 观测CPU时间 $java -agentlib:hprof=cpu=samples <Program> $java -agentlib:hprof=cpu=times <Program>
Jmap 从运行的JVM进程,或者Core文件中提取内 存使用的统计信息 $jmap -heap <jid> $jmap -histo <jid> $jmap -permstat <jid> $jmap -dump:format=b,file=filename <jid>
Jhat & OQL 将heap中的对象通过Web的形式表现出来并 且提供各种查询手段 对于Heap上各个对象实例的统计显示 显示活动对象实例到root对象的路径 现实Pending Finalization对象 OQL(Object Query Language) 定制查询条件 语法类似于JavaScript
Dtrace hotspot Provider提供各种观测JVM运行的 探针 Vm生命周期 线程生命周期 类装载 垃圾回收 方法编译 hotspot_jni Provider提供观测JNI代码的 探针
访问Javac编译器的编程接口 import javax.compiler.*; Compiler c = Compiler.newInstance(); c.setOutputDirectory(new File("build/classes")); c.setSourcePath(new File("src"), new File("gensrc")); c.setOption("Xlint", "all"); c.run(new File("src/Main.java"));
Annotation处理器接口 public class ToDoProcessor implements AnnotationProcessor { ... public void process() { AnnotationTypeDeclaration toDoDecl = atds.iterator().next(); for(Declaration decl : env.getDeclarationsAnnotatedWith(toDoDecl)) { System.out.format("%-16s %s%n", decl.toString(); decl.getAnnotation(ToDo.Class); }
资源和链接 http://jdk.dev.java.net http://jcp.org http://java.sun.com/
Java SE 6特性 Sun Microsystems