ITPUB??ì3
ITPUB论坛 » Java入门与认证版 » J2SE 1.5简介


标题: J2SE 1.5简介
离线 miaogsh
月球主管



精华贴数 0
个人空间 0
技术积分 136 (12813)
社区积分 1 (33386)
注册日期 2003-3-10
论坛徽章:0
      
      

发表于 2004-3-23 15:54 
J2SE 1.5简介

易于开发性
您也喧钛经见过这样的报告,即一些新的 Java 觼E员浠丒子诳⑿灾魈狻U庑┍浠丒ǚ盒汀⒃荨utoboxing、增强的 for 循环、枚举类型、静态导葋E 风格的格式化 I/O、可变参数、并发实用程序以及竵E虻サ?RMI 接口生成。

JSR 201 皝Eㄈ缦滤母鲇丒员浠涸銮康?for 循环、枚举类型、静态导葋E?autoboxing;JSR 175 指定了新的元数据功能,秮E JSR 14 则蟻E杆得髁朔盒汀?/P>

javac 编襾E髦葱械哪嫌丒怨娣妒前姹?1.4。这意味着要利用以下觼E员浠娜魏魏么Γ枰丒javac 脕E莶问?-source 1.5。

元数据
J2SE 1.5 中的元数据特性提供这样的能力,即蟻EJava 类、接口、方法和字段关联附加的数据。这些附加的数据或者注释,可以被 javac 编襾E骰蚱渌ぞ叨寥。⑶腋菖渲貌煌梢员槐4嬖诶辔募校部梢栽谠诵惺笔褂?Java 反蓙EAPI 被发现。

蟻EJava 平台增加元数据的一个主要原因是,使得开发工具和运行工具有一个通用的基础结构,以减少开发和部署所需的成本。工具可以使用元数据信息生成附加的源代聛E蛘咴诘魇允碧峁└郊有畔ⅰ?/P>

下面的例子用元数据工具创建了一个调试元数据注释,这些元数据注释然后又简单地在运行时显示出来。可以蟻E瘢蟛糠值脑荼丒┬纬梢桓霰丒迹匆桓隽己霉娣兜募稀?/P> import java.lang.annotation.*;
import java.lang.reflect.*;
                                                                                
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @interface debug  {
    boolean  devbuild() default false;
    int counter();
}
                                                                                
public class MetaTest {
    final boolean production=true;

    @debug(devbuild=production,counter=1) public void testMethod()  {
    }

                                                                              
    public static void main(String[] args) {
                                                                                
        MetaTest mt = new MetaTest();
        try {
            Annotation[] a = mt.getClass().getMethod("testMethod".getAnnotations();
            for (int i=0; i<a.length ; i++)  {
                 System.out.println("a["+i+"]="+a+" ";
             }
         } catch(NoSuchMethodException e) {
             System.out.println(e);
         }
     }
}





利用一个元数据处历栅具,喧亦重复的代聛E嘈床街杩梢约跎俪梢桓黾蛄返脑荼丒@纾梦誓掣丒JAX-RPC 服务实现时所需的远程接口可以实现为:

原来(J2SE 1.5 以前版本):

  public interface PingIF extends Remote {
      public void ping() throws RemoteException;
  }

  public class Ping implements PingIF {
     public void ping() {
     }
  }





现在:

  public class Ping {
     public @remote void ping() {
     }
  }





范型
范型一直是 Java 社团所广泛期待的,现在已经是 J2SE 1.5 的一部分了。肴见到使用泛型的地方是在 Collections API 中。Collections API 提供可以被多竵EJava 类型使用的公共功能性,比葋ELinkedLists、ArrayLists 和 HashMaps。下一个例子使用 1.4.2 库和默认的 javac 编襾EJ健?/P>   ArrayList list = new ArrayList();
  list.add(0, new Integer(42));
  int total = ((Integer)list.get(0)).intValue();





煮一行中的 Integer 转换是泛型所要防止的强制类型转换问题的一个例子。这个问题在于,1.4.2 Collections API 使用 Object 类来存储 Collection 对象,这就意味着在编襾E氖焙虿荒苷页隼嘈推ヅ洹N侍獾牡谝桓霰丒拘畔⑹窃谠诵惺迸壮龅? ClassCastException。

带有范型化 Collections 库的同一个例子可编写为:

ArrayList<Integer> list =  new ArrayList<Integer>();
   list.add(0, new Integer(42));
   int total = list.get(0).intValue();




范型化 API 的用户必衼E褂?<> 符号简单地声明在编襾E嘈椭惺褂玫睦嘈汀2恍枰魏卫嘈妥唬诒纠惺酝枷蛞桓丒Integer 类型的集合中铁赜 String 对象将会在编襾E北徊痘瘛?/P>

因此,范型允衼EAPI 设计者提供这样的公共功能性:可以觼E嘀质堇嘈鸵黄鹗褂茫部梢栽诒嘁丒背鲇诶嘈桶踩运丒屑丒椤?

设计自己的 Generic API 比起只是使用藖E抢此狄晕⒏丛右恍G丒硬榭?java.util.Collection 源代聛E?API 指南开始。

原觼E嘈偷?Autoboxing 和 Auto-unboxing
蟻Eint、boolean 以及藖E堑幕诙韵蟮亩杂ξ丒ū热丒Integer 和 Boolean)这样的原觼E嘈椭涞淖恍枰罅坎槐匾亩獗嗦丒? 尤其是当只是蟻ECollections API 这样的方法调用需要转换时竵E酢?/P>

Java 原觼E嘈偷?autoboxing 和 auto-unboxing 产生竵E泳凡⒏丒右子诶獾拇丒?.5 版本让所需要的转换转变成 Integer 并转换回编襾E鳌?/P>

原来

  ArrayList<Integer> list = new ArrayList<Integer>();
  list.add(0, new Integer(42));
  int total = (list.get(0)).intValue();




现在

  ArrayList<Integer> list = new ArrayList<Integer>();
  list.add(0, 42);
  int total = list.get(0);




增强的 for 循环
Collections API 经常使用 Iterator 类。Iterator 类提供在 Collection 中顺序导航的机制。当像下面一样只是在 Collection 中遍历时,新的增强的 for 循环可取磥Eiterator。编襾E魃杀匾难反丒蛭梅缎停圆恍枰獾睦嘈妥弧?

原来

   ArrayList<Integer> list = new ArrayList<Integer>();
  for (Iterator i = list.iterator(); i.hasNext() {
         Integer value=(Integer)i.next();
    }




现在

    ArrayList<Integer> list = new ArrayList<Integer>();  
     for (Integer i : list) { ... }




枚举类型
当使用 static final 型常量时,该类型提供枚举的类型。如果您以前在自己的应用程序中使用过眮E斗丒enum,那么在利用 javac -source 1.5 编襾E毙枰髡创丒?/P>   public enum StopLight { red, amber, green };





静态导葋E/H3>
静态导葋E匦允迪治癷mport static”,允喧帔从一个类引用静态常量,而不需要继承这个类。每次我们铁赜一个组件时,不必使用 BorderLayout.CENTER,只要引用 CENTER 就可以了。

  import static java.awt.BorderLayout.*;

getContentPane().add(new JPanel(), CENTER);




格式化的输硜E/H3>
现在开发人员可以选择使用 printf type 功能性来生成格式化的输出。这将有助于迁移传统的 C 应用程序,作很少的竵E幕蛘卟蛔鞲丒木湍鼙A粝嗤奈谋静季帧?/P>

大多数公共 C printf 格式化程序是可用的,龙殁,一些 Java 类(比葋EDate 和BigInteger)也具有格式化规则。竵E嘈畔⑶丒渭丒 java.util.Formatter 类。

    System.out.printf("name count\n";
    System.out.printf("%s %5d\n", user,total);




格式化的输葋E/H3>
Scanner API 为从系统控制台或任何数据流读取数据提供基本的输葋Eδ苄浴O旅娴睦哟颖丒际淙丒寥∫桓丒String 并期待下一竵E int 值。

如果没有数据可用,蟻Enext 和 nextInt 这样的 Scanner 方法将会阻塞。如果您需要处历詠E痈丛拥氖淙丒敲创? java.util.Formatter 类还可以得到模式匹配算法。

    Scanner s=Scanner.create(System.in);
    String param= s.next();
    int value=s.nextInt();
    s.close();




Varargs
varargs(可变参数)功能性允喧亦个参数传递作为方法的参数。藖E枰虻サ?... 符号,该符号用于接收参数列柄涯方法,并且藖E贡挥糜谑迪? printf 所需参数的灵畸纨量。

    void argtest(Object ... args) {
      for (int i=0;i <args.length; i++) {
      }
    }
   
    argtest("test", "data";






并发实用程衼E/H3>
并发实用程序库由 Doug Lea 定义在 JSR-166 中,是 J2SE 1.5 平台中流行的并发鳃佝皝E囊桓鎏厥獍姹尽K丒峁┣看蟮摹⒏呒侗鸬南叱坦乖丒丒? executors(这是一个线程任务框架)、线程安全队列、Timers、锁(皝Eㄔ铀┖推渌皆丒?/P>

著名的苼E丒╯emaphore)是这样一个锁。苼E丒丒衷谑褂玫?wait 的使用方式相同,用于限制对一块代聛E姆梦省F丒丒丒恿榛⑶乙苍市嗖⒎⒌南叱谭梦剩痹市诨竦靡桓鏊岸运丒胁馐浴O旅娴睦邮褂酶蘸靡桓銎丒丒步凶龆破丒丒8丒嘈畔⑶丒渭丒 java.util.concurrent 鳃佝皝E?/P>     final  private Semaphore s= new Semaphore(1, true);

    s.acquireUninterruptibly(); //for non-blocking version use s.acquire()
     
    balance=balance+10; //protected value
    s.release(); //return semaphore token





rmic —— rmi 编襾E丒/H3>
您不再需要使用 rmic —— rmi 编襾E鞴ぞ摺瓷勺冻痰慕涌诖娓6囊丒馕蹲磐ǔS纱娓峁┑男畔⒖梢栽谠诵惺北环⑾帧8丒嘈畔⑶丒渭丒 RMI 版本说脕E/A>。

可扩展性和性能
1.5 版本承诺在可扩展性和性能方面的改进,新的重点在于启动时间和内存占用,使藖E丒右子谝宰蟮乃俣炔渴鹩τ贸绦颉?/P>

蜇大的一个竵E率且丒?Hotspot JVM 中的类数据共销剑该技术不仅在多个正在运行的 JVM 之间共销蚧读数据,而且改进了启动时间,因为核心的 JVM 类都是预先打皝E摹?/P>

性能工效是 J2SE 1.5 中的一个新特性,这意味着如果您一直使用的是以前版本中专门的 JVM 运行时选消楷 那么可能值得不用选消昨者用很少的选消蜇新验证您的性能。

监控和可管历煸
监控和可管历煸是 Java 平台中的 RAS (Reliability, Availability, Serviceability,即可靠性、可用性、可服务性) 的一个关紒E榧?/P>

JVM Monitoring & Management API (JSR-174) 指定一组全面的可以从正在运行的 JVM 进行监控的 JVM internals。 该信息可通过 JMX (JSR-003) MBeans 访问到,也可以使用 JMX 远程接口 (JSR-160) 和行业眮E?SNMP 工具而远程访问得到。

镄用的一个特性是一个低内存紒E獬绦颉5背е凳保琂MX MBeans 可以通知已注册的諄E绦颉8丒嘈畔⑶丒渭丒javax.management 和 java.lang.management。

为了了解新的 API 是多么容易使用,下面报告了 Hotspot JVM 中内存堆的蟻E甘褂们榭觥?/P> import java.lang.management.*;
import java.util.*;
import javax.management.*;

public class MemTest {
    public static void main(String args[]) {
      List pools =ManagementFactory.getMemoryPoolMBeans();
      for(ListIterator i = pools.listIterator(); i.hasNext() {
            MemoryPoolMBean p = (MemoryPoolMBean) i.next();
            System.out.println("Memory type="+p.getType()+" Memory usage="+p.getUsage());
        }
    }
}





新的 JVM profiling API (JSR-163)
该版本还皝E桓龈丒看蟮谋净丒profiling API,叫讈EJVMTI。该 API 已经在 JSR 163 中指定了,并由对改善的 profiling 接口的需求所推动。但是,JVMTI 除了具有 profiling 功能之外,还蟻E侨段的本机内部过程工具访问,皝E嗫毓ぞ摺⒌魇怨ぞ咭约扒痹诘母髦指餮钠渌丒治龉ぞ摺?/P>

该实现皝E桓鲇糜谧纸诼丒爸茫╥nstrumentation)——Java 编程觼E宰爸梅瘢↗ava Programming Language Instrumentation Services,JPLIS)的机制。这使得分析工具只在需要的地方铁赜尔殁的配置信息(profiling)。该技术的优点是,藖E市丒蛹械姆治觯⑶蚁拗屏苏谠诵械? JVM 上的 profiling 工具的引用。该装置甚至可以在运行时和类加载时动态地生成,并且可以作为类文件预先处历剑

下面这个例子创建了一个装置钩(instrumentation hook),藖E梢源哟排碳釉乩辔募囊桓鲆研薷牡陌姹尽R诵懈貌馐裕衫? java -javaagent:myBCI BCITest 启动 JRE。


//File myBCI.java
import java.lang.instrument.Instrumentation;

public class myBCI {
     private static Instrumentation instCopy;
     
     public static void premain(String options, Instrumentation inst) {
         instCopy = inst;
     }
     public static Instrumentation getInstrumentation() {
         return instCopy;
     }
}

//File BCITest.java

import java.nio.*;
import java.io.*;
import java.nio.channels.*;
import java.lang.instrument.*;

public class BCITest {
     public static void main (String[] args) {
         try {
             OriginalClass mc = new OriginalClass();
             mc.message();
         
             FileChannel fc=new FileInputStream(new File("modified"+File.separator+"OriginalClass.class").getChannel();
             ByteBuffer buf = fc.map(FileChannel.MapMode.READ_ONLY, 0, (int)fc.size());
             byte[] classBuffer  = new byte[buf.capacity()];
             buf.get(classBuffer, 0, classBuffer.length);
             myBCI.getInstrumentation().redefineClasses(new ClassDefinition[] {new ClassDefinition(mc.getClass(), classBuffer)});
             mc.message();
         }catch (Exception e){}
     }
}

//OriginalClass.java
//Compile in current directory
//Copy source to modified directory,change message and recompile

public class OriginalClass {
     public void message() {
         System.out.println("OriginalClass";
     }
}





改进的諄E夏芰?/H3>
如果没有控制台窗口可用,生成的 Stack 跟踪就很笨拙。两个新的 API —— getStackTrace 和 Thread.getAllStackTraces —— 以程序的方式提供该信息。

StackTraceElement e[]=Thread.currentThread().getStackTrace();
for (int i=0; i <e.length; i++) {
     System.out.println(e);
    }
System.out.println("\n"+Thread.getAllStackTraces());




Hotspot JVM 皝E桓鲋旅丒拇蟠绦颍╡rror hander),如箒EJVM 襾EV卸希丒梢栽诵杏没峁┑慕疟尽J褂? Hotspot JVM 可服务性代历莠接器,调试工具也可以连接到一个挂起的 JVM 或者核心文件。

-XX:OnError="command"  
      

-XX:OnError="pmap %p"
-XX:OnError="gdb %p"

optional %p used as process id




桌面客户端
Java 桌面客户端保留有 Java 平台的一个关紒E榧⑶艺庖坏愠闪?J2SE 1.5 中喧亦改进的焦点。

这竵EBeta 版本皝E舳奔浜湍诖嬲加梅矫娴囊恍┰缙诟慕8冒姹静唤龈丒丒⑶?Swing 工具集采用了一个暂新的叫讈EOcean 的主题。

通过建立 J2SE 1.4.2 中的竵E拢珿TK 和 Windows XP 外观方面有了竵E徊降母慕?/P>  
Windows XP
Click to Enlarge
  
Linux/Redhat
Click to Enlarge




具有炻 OpenGL 驱动程序并且选择了图形卡的 Linux 和 Solaris 用户,可以使用下面的运行时属性从 Java2D 获得本机硬件加速:

java -Dsun.java2d.opengl=true -jar Java2D.

Linux 版本也具有縼E俚?X11 Toolkit,叫讈EXAWT,默认情况下是启用的。如果您需要觼Emotif 版本进行比较,可以使用下面的系统属性:

java -Dawt.toolkit=sun.awt.motif.MToolkit -jar Notepad.jar

(X11 Toolkit 叫讈Esun.awt.X11.XToolkit)

X11 Toolkit 也使用 XDnD 协议,所以您可以在 Java 和其他应用(比葋EStarOffice 粊EMozilla)之间拖放简单的组件。

其他特性
核心 XML 支持
J2SE 1.5 引葋E撕诵?XML 平台的几个修订,皝E?XML 1.1 和 Namespace、XML Schema、SAX 2.0.1、XSLT 和縼E?XLSTC 编襾E鳎约白蟮?DOM 第 3 层支持。

除了支持核心 XML 之外,未来版本的 Java Web Services Developer Pack 将交付炻的 Web 服务眮E迹篔AX-RPC & SAAJ (WSDL/SOAP)、JAXB、XML Encryption and Digital Signature,以及用于注册的 JAXR。

辅助字符支持
32 位的辅助字符支持作为传输到 Unicode 4.0 支持的一部分,已经慎重地铁赜到该平台。辅助字符被编聛E欢蕴厥獾?UTF16 值,以生成一个不同的字符或者聛E悖╟odepoint)。一个代历以(surrogate pair)是一个高 UTF16 值和后面的一个低 UTF16 值的组合。这些高值和低值来自一个特殊范围的 UTF16 值。

一般来说,当使用 String 或者字符序列时,核心 API 库将透明地为您处历炻的辅助字符。但是因为 Java "char" 仍然保留为 16 位,所以非常少的一些使用 char 作为参数的方法,现在有了足够的可以接受 int 值的方法,其中 int 值可以代柄炻的竵E蟮闹怠L乇鹗? Character 类,具有附加的方法来紒E鞯鼻暗淖址徒酉吕吹淖址员慵丒鞲ㄖ穆丒阒担缦滤荆?/P>         String u="\uD840\uDC08";
    System.out.println(u+"+ "+u.length());
    System.out.println(Character.isHighSurrogate(u.charAt(0)));
    System.out.println((int)u.charAt(1));
    System.out.println((int)u.codePointAt(0));





竵E嘈畔⑶丒渭丒Character 中的 Unicode 部分。

JDBC RowSets
JDBC 行集支持有两个主要的竵E隆?CODE>CachedRowSet 皝E邮菘饧丒鞯男械哪诖嬷械募稀5撬丒且彩遣涣拥模庖馕蹲乓院蟾丒驴梢杂丒菘庵匦峦健?/P>

龙罨个组件是 WebRowSet,藖E褂檬菘庑型ü?XML 来传输数据


__________________
人生以享乐为先,岂不快哉
只看该作者    顶部
离线 miaogsh
月球主管



精华贴数 0
个人空间 0
技术积分 136 (12813)
社区积分 1 (33386)
注册日期 2003-3-10
论坛徽章:0
      
      

发表于 2004-3-23 15:56 
不好意思有乱码

我的系统是日文的,没办法了


__________________
人生以享乐为先,岂不快哉
只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问