﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-火焰出林工作室-文章分类-Core JAVA</title><link>http://www.blogjava.net/blameswood/category/26348.html</link><description>程序人生:JAVA Web之路</description><language>zh-cn</language><lastBuildDate>Thu, 03 Apr 2008 00:25:24 GMT</lastBuildDate><pubDate>Thu, 03 Apr 2008 00:25:24 GMT</pubDate><ttl>60</ttl><item><title>Java Reflection (JAVA反射) </title><link>http://www.blogjava.net/blameswood/articles/189080.html</link><dc:creator>火焰出林</dc:creator><author>火焰出林</author><pubDate>Thu, 27 Mar 2008 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/blameswood/articles/189080.html</guid><wfw:comment>http://www.blogjava.net/blameswood/comments/189080.html</wfw:comment><comments>http://www.blogjava.net/blameswood/articles/189080.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blameswood/comments/commentRss/189080.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blameswood/services/trackbacks/189080.html</trackback:ping><description><![CDATA[Java Reflection (JAVA反射)&nbsp;&nbsp;&nbsp;&nbsp;----转载<br />
<br />
&nbsp;&nbsp;&nbsp; Reflection 是 Java 程序开发语言的特征之一，它允许运行中的 Java 程序对自身进行检查，或者说&#8220;自审&#8221;，并能直接操作程序的内部属性。例如，使用它能获得 Java 类中各成员的名称并显示出来。Java 的这一能力在实际应用中也许用得不是很多，但是在其它的程序设计语言中根本就不存在这一特性。例如，Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。<br />
JavaBean 是 reflection 的实际应用之一，它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。<br />
<br />
1. 一个简单的例子<br />
考虑下面这个简单的例子，让我们看看 reflection 是如何工作的。<br />
import java.lang.reflect.*;<br />
public class DumpMethods {<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class c = Class.forName(args[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method m[] = c.getDeclaredMethods();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; m.length; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(m[i].toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<p><br />
按如下语句执行：<br />
java DumpMethods java.util.Stack<br />
<br />
它的结果输出为：<br />
public java.lang.Object java.util.Stack.push(java.lang.Object)<br />
public synchronized java.lang.Object java.util.Stack.pop()<br />
public synchronized java.lang.Object java.util.Stack.peek()<br />
public boolean java.util.Stack.empty()<br />
public synchronized int java.util.Stack.search(java.lang.Object)</p>
<p>这样就列出了java.util.Stack 类的各方法名以及它们的限制符和返回类型。</p>
<p>这个程序使用 Class.forName 载入指定的类，然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类。</p>
<br />
<p>2.开始使用 Reflection<br />
用于 reflection 的类，如 Method，可以在 java.lang.relfect 包中找到。使用这些类的时候必须要遵循三个步骤：第一步是获得你想操作的类的 java.lang.Class 对象。在运行中的 Java 程序中，用 java.lang.Class 类来描述类和接口等。</p>
<p>下面就是获得一个 Class 对象的方法之一：<br />
Class c = Class.forName("java.lang.String");<br />
这条语句得到一个 String 类的类对象。还有另一种方法，如下面的语句：<br />
Class c = int.class;&nbsp;&nbsp; 或者&nbsp;&nbsp; Class c = Integer.TYPE;</p>
<p>它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 (如 Integer) 中预先定义好的 TYPE 字段。<br />
<br />
第二步是调用诸如 getDeclaredMethods 的方法，以取得该类中定义的所有方法的列表。<br />
<br />
一旦取得这个信息，就可以进行第三步了——使用 reflection API 来操作这些信息，如下面这段代码：<br />
Class c = Class.forName("java.lang.String");<br />
Method m[] = c.getDeclaredMethods();<br />
System.out.println(m[0].toString());<br />
它将以文本方式打印出 String 中定义的第一个方法的原型。<br />
在下面的例子中，这三个步骤将为使用 reflection 处理特殊应用程序提供例证。</p>
<br />
<p><br />
模拟 instanceof 操作符<br />
得到类信息之后，通常下一个步骤就是解决关于 Class 对象的一些基本的问题。例如，Class.isInstance 方法可以用于模拟 instanceof 操作符：<br />
class A {<br />
}<br />
<br />
public class instance1 {<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("A");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean b1 = cls.isInstance(new Integer(37));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(b1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean b2 = cls.isInstance(new A());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(b2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
在这个例子中创建了一个 A 类的 Class 对象，然后检查一些对象是否是 A 的实例。Integer(37) 不是，但 new A() 是。</p>
<p><br />
3.找出类的方法<br />
找出一个类中定义了些什么方法，这是一个非常有价值也非常基础的 reflection 用法。下面的代码就实现了这一用法：<br />
import java.lang.reflect.*;<br />
public class method1 {<br />
&nbsp;&nbsp;&nbsp; private int f1(Object p, int x) throws NullPointerException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (p == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NullPointerException();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("method1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method methlist[] = cls.getDeclaredMethods();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; methlist.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method m = methlist[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("name = " + m.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("decl class = " + m.getDeclaringClass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class pvec[] = m.getParameterTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; pvec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("param #" + j + " " + pvec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class evec[] = m.getExceptionTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; evec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("exc #" + j + " " + evec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("return type = " + m.getReturnType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("-----");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p><br />
这个程序首先取得 method1 类的描述，然后调用 getDeclaredMethods 来获取一系列的 Method 对象，它们分别描述了定义在类中的每一个方法，包括 public 方法、protected 方法、package 方法和 private 方法等。如果你在程序中使用 getMethods 来代替 getDeclaredMethods，你还能获得继承来的各个方法的信息。<br />
<br />
取得了 Method 对象列表之后，要显示这些方法的参数类型、异常类型和返回值类型等就不难了。这些类型是基本类型还是类类型，都可以由描述类的对象按顺序给出。<br />
<br />
输出的结果如下：<br />
name = f1<br />
decl class = class method1<br />
param #0 class java.lang.Object<br />
param #1 int<br />
exc #0 class java.lang.NullPointerException<br />
return type = int<br />
-----<br />
name = main<br />
decl class = class method1<br />
param #0 class [Ljava.lang.String;<br />
return type = void<br />
-----</p>
<br />
<p>4.获取构造器信息<br />
获取类构造器的用法与上述获取方法的用法类似，如：<br />
import java.lang.reflect.*;<br />
public class constructor1 {<br />
&nbsp;&nbsp;&nbsp; public constructor1() {<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; protected constructor1(int i, double d) {<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("constructor1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor ctorlist[] = cls.getDeclaredConstructors();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; ctorlist.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor ct = ctorlist[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("name = " + ct.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("decl class = " + ct.getDeclaringClass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class pvec[] = ct.getParameterTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; pvec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("param #" + j + " " + pvec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class evec[] = ct.getExceptionTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; evec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("exc #" + j + " " + evec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("-----");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p><br />
这个例子中没能获得返回类型的相关信息，那是因为构造器没有返回类型。<br />
这个程序运行的结果是：<br />
name = constructor1<br />
decl class = class constructor1<br />
-----<br />
name = constructor1<br />
decl class = class constructor1<br />
param #0 int<br />
param #1 double<br />
-----<br />
<br />
5.获取类的字段(域)<br />
找出一个类中定义了哪些数据字段也是可能的，下面的代码就在干这个事情：<br />
import java.lang.reflect.*;<br />
<br />
public class field1 {<br />
&nbsp;&nbsp;&nbsp; private double d;<br />
&nbsp;&nbsp;&nbsp; public static final int i = 37;<br />
&nbsp;&nbsp;&nbsp; String s = "testing";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("field1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fieldlist[] = cls.getDeclaredFields();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; fieldlist.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fld = fieldlist[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("name = " + fld.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("decl class = " + fld.getDeclaringClass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("type = " + fld.getType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mod = fld.getModifiers();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("modifiers = " + Modifier.toString(mod));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("-----");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p><br />
这个例子和前面那个例子非常相似。例中使用了一个新东西 Modifier，它也是一个 reflection 类，用来描述字段成员的修饰语，如&#8220;private int&#8221;。这些修饰语自身由整数描述，而且使用 Modifier.toString 来返回以&#8220;官方&#8221;顺序排列的字符串描述 (如&#8220;static&#8221;在&#8220;final&#8221;之前)。这个程序的输出是：<br />
name = d<br />
decl class = class field1<br />
type = double<br />
modifiers = private<br />
-----<br />
name = i<br />
decl class = class field1<br />
type = int<br />
modifiers = public static final<br />
-----<br />
name = s<br />
decl class = class field1<br />
type = class java.lang.String<br />
modifiers =<br />
-----<br />
<br />
和获取方法的情况一下，获取字段的时候也可以只取得在当前类中申明了的字段信息 (getDeclaredFields)，或者也可以取得父类中定义的字段 (getFields) 。</p>
<br />
<p>6.根据方法的名称来执行方法<br />
文本到这里，所举的例子无一例外都与如何获取类的信息有关。我们也可以用 reflection 来做一些其它的事情，比如执行一个指定了名称的方法。下面的示例演示了这一操作：<br />
import java.lang.reflect.*;<br />
public class method2 {<br />
&nbsp;&nbsp;&nbsp; public int add(int a, int b) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a + b;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("method2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class partypes[] = new Class[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[0] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[1] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method meth = cls.getMethod("add", partypes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method2 methobj = new method2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arglist[] = new Object[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[0] = new Integer(37);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[1] = new Integer(47);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object retobj = meth.invoke(methobj, arglist);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer retval = (Integer) retobj;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(retval.intValue());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p><br />
假如一个程序在执行的某处的时候才知道需要执行某个方法，这个方法的名称是在程序的运行过程中指定的 (例如，JavaBean 开发环境中就会做这样的事)，那么上面的程序演示了如何做到。</p>
<p><br />
上例中，getMethod 用于查找一个具有两个整型参数且名为 add 的方法。找到该方法并创建了相应的 Method 对象之后，在正确的对象实例中执行它。执行该方法的时候，需要提供一个参数列表，这在上例中是分别包装了整数 37 和 47 的两个 Integer 对象。执行方法的返回的同样是一个 Integer 对象，它封装了返回值 84。</p>
<p><br />
7.创建新的对象<br />
对于构造器，则不能像执行方法那样进行，因为执行一个构造器就意味着创建了一个新的对象 (准确的说，创建一个对象的过程包括分配内存和构造对象)。所以，与上例最相似的例子如下：<br />
import java.lang.reflect.*;<br />
public class constructor2 {<br />
&nbsp;&nbsp;&nbsp; public constructor2() {<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public constructor2(int a, int b) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("a = " + a + " b = " + b);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("constructor2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class partypes[] = new Class[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[0] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[1] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor ct = cls.getConstructor(partypes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arglist[] = new Object[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[0] = new Integer(37);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[1] = new Integer(47);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object retobj = ct.newInstance(arglist);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
根据指定的参数类型找到相应的构造函数并执行它，以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象，而不是在编译的时候创建对象，这一点非常有价值。</p>
<p><br />
8.改变字段(域)的值<br />
reflection 的还有一个用处就是改变对象数据字段的值。reflection 可以从正在运行的程序中根据名称找到对象的字段并改变它，下面的例子可以说明这一点：<br />
import java.lang.reflect.*;<br />
public class field2 {<br />
&nbsp;&nbsp;&nbsp; public double d;<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("field2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fld = cls.getField("d");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; field2 f2obj = new field2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("d = " + f2obj.d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fld.setDouble(f2obj, 12.34);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("d = " + f2obj.d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p><br />
这个例子中，字段 d 的值被变为了 12.34。<br />
9.使用数组<br />
本文介绍的 reflection 的最后一种用法是创建的操作数组。数组在 Java 语言中是一种特殊的类类型，一个数组的引用可以赋给 Object 引用。观察下面的例子看看数组是怎么工作的：<br />
import java.lang.reflect.*;<br />
public class array1 {<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("java.lang.String");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arr = Array.newInstance(cls, 10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array.set(arr, 5, "this is a test");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = (String) Array.get(arr, 5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p><br />
例中创建了 10 个单位长度的 String 数组，为第 5 个位置的字符串赋了值，最后将这个字符串从数组中取得并打印了出来。<br />
<br />
下面这段代码提供了一个更复杂的例子：<br />
import java.lang.reflect.*;<br />
public class array2 {<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int dims[] = new int[]{5, 10, 15};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arr = Array.newInstance(Integer.TYPE, dims);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arrobj = Array.get(arr, 3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = arrobj.getClass().getComponentType();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(cls);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arrobj = Array.get(arrobj, 5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array.setInt(arrobj, 10, 37);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int arrcast[][][] = (int[][][]) arr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(arrcast[3][5][10]);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
例中创建了一个 5 x 10 x 15 的整型数组，并为处于 [3][5][10] 的元素赋了值为 37。注意，多维数组实际上就是数组的数组，例如，第一个 Array.get 之后，arrobj 是一个 10 x 15 的数组。进而取得其中的一个元素，即长度为 15 的数组，并使用 Array.setInt 为它的第 10 个元素赋值。<br />
<br />
注意创建数组时的类型是动态的，在编译时并不知道其类型。</p>
<img src ="http://www.blogjava.net/blameswood/aggbug/189080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blameswood/" target="_blank">火焰出林</a> 2008-03-27 17:35 <a href="http://www.blogjava.net/blameswood/articles/189080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>漫长的道路——走向J2EE </title><link>http://www.blogjava.net/blameswood/articles/150442.html</link><dc:creator>火焰出林</dc:creator><author>火焰出林</author><pubDate>Thu, 04 Oct 2007 14:05:00 GMT</pubDate><guid>http://www.blogjava.net/blameswood/articles/150442.html</guid><wfw:comment>http://www.blogjava.net/blameswood/comments/150442.html</wfw:comment><comments>http://www.blogjava.net/blameswood/articles/150442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blameswood/comments/commentRss/150442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blameswood/services/trackbacks/150442.html</trackback:ping><description><![CDATA[<p>初次涉及<a href="http://www.javadby.com/"><u>Java</u></a>领域，感觉到<a href="http://www.javadby.com/"><u>Java</u></a>入门是好像没有C,C++入门快，工具也没有什么Turbo C,Visual C++好用（自己的破机器实在陪不起JBuilder，贪婪的家伙，以后一定要收拾她）。什么JAVA_HOME,CLASSPATH，虚拟机等概念都是初次基础，旁边的人都很少用<a href="http://www.javadby.com/"><u>Java</u></a>的。感觉<a href="http://www.javadby.com/"><u>Java</u></a>就是做Applet的。慢慢的知道了<a href="http://java.sun.com/">http://java.sun.com</a>，开始知道<a href="http://www.javadby.com/"><u>Java</u></a>博大精深。让我不可思议的是JAVA 2,JDK,J2SE,<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>,J2ME等新名词在自己的脑海里蔓延。慢慢的自己知道了JCP组织是制定<a href="http://www.javadby.com/"><u>Java</u></a>相关规范的发源地<a href="http://java.jcp.org/">http://java.jcp.org</a> ,于是订阅了一份邮件列表。真是好东西啊，定期有<a href="http://www.javadby.com/"><u>Java</u></a>的最新动向，所以<a href="http://www.javadby.com/"><u>Java</u></a>的动态尽收眼里，建议大家也去订阅一份。免费的。自己动手下载了<a href="http://www.javadby.com/"><u>Java</u></a>(TM) 2 SDK和<a href="http://www.javadby.com/"><u>Java</u></a>(TM) 2 SDK Documentation后,不懂的就查<a href="http://www.javadby.com/"><u>Java</u></a>(TM) 2 SDK Documentation,特别好用，也不需要什么手册之类的，建议大家都要有一份。<br />
&nbsp;&nbsp;&nbsp; 搭起<a href="http://www.javadby.com/"><u>Java</u></a>开发环境后，记得还是用UltraEdit编辑并编译的（在其中可以配好<a href="http://www.javadby.com/"><u>Java</u></a>的编译环境）。慢慢的改用JCreator了。不错，至少很多方面有改进。最开始卖了一套&lt;<a href="http://www.javadby.com/"><u>Java</u></a> 2核心技术&gt; 2本书，还不错。对于入门来说足够了。慢慢的知道&lt;Thinking in <a href="http://www.javadby.com/"><u>Java</u></a>&gt;是一本好书，后来才知道，有了<a href="http://www.javadby.com/"><u>Java</u></a>经验后，看这本书特别过瘾，所以现在还经常翻翻。周而复始的看，效果特别好。慢慢的知道了Oreilly公司（<a href="http://www.oreilly.com/">http://www.oreilly.com</a>）出的图书不错，很高雅，国内翻译的也还可以（<a href="http://www.oreilly.com.cn/">http://www.oreilly.com.cn</a>）。本人收集了很多Oreilly的原版图书，有需要的可以和我联系（Acrobat pdf格式）。慢慢知道了jjhou这个人.(<a href="http://jjhou.csdn.net/">http://jjhou.csdn.net</a> )以及他的个人网站，最让我感兴趣的是jjhou老师写的散文，书评，很有收获，不是为技术而技术。很有趣味性。其中, <a href="http://www.epubcn.com/">http://www.epubcn.com</a> 上有很多美丽的图书。<br />
&nbsp;&nbsp;&nbsp; 不知道什么时候，要开始干项目了，以前从书上看到的东西，慢慢的在项目中有了很好的机会去温习，慢慢的有了感觉，开始主要是用Swing,开发桌面系统，放置一个按钮怎么也放不好，后来才知道有一个布局管理器。咳，这个婆婆的<a href="http://www.javadby.com/"><u>Java</u></a>也讨厌的很。开始涉及到数据库访问,JDBC。后来我才知道，Sun的<a href="http://www.javadby.com/"><u>Java</u></a>网站有一个<a href="http://www.javadby.com/"><u>Java</u></a> Tutorial。（<a href="http://java.sun.com/docs/books/tutorial/">http://java.sun.com/docs/books/tutorial/</a> ）。同时，也知道了蔡??先生的sleepless in java(<a href="http://www.oreilly.com.tw/sleepless/index.htm">http://www.oreilly.com.tw/sleepless/index.htm</a> ),太美了，美的很。 满满的，OReilly, <a href="http://www.onjava.com/">http://www.onjava.com/</a> 也是不错的地方。都有很多优秀的文章。<a href="http://www-900.ibm.com/developerWorks/cn/index.shtml">http://www-900.ibm.com/developerWorks/cn/index.shtml</a>，也很棒。<br />
&nbsp;&nbsp;&nbsp; 每次，美美的享用一顿大餐后，也来也觉得自己是不是应该换一种学习方式，因为这样学习效果不太好。比较乱。让我想起了<a href="http://www.javadby.com/"><u>Java</u></a> Specification，对，我开始研究<a href="http://www.javadby.com/"><u>Java</u></a>规范了。最开始下载的规范是JDBC Specification，很多概念一目了然，尤其是DATABASE的事务性控制，自己对于她的理解慢慢的有了较为深入的了解。对于开发C/S结构，比如,Swing+JDBC,开发数据库应用系统，让我学会开发两层结构的应用系统。很神气。<br />
&nbsp;&nbsp;&nbsp; 也不知道什么时候要开始开发一个网站，基于Linux+JSP+<a href="http://www.javadby.com/"><u>Java</u></a>Bean+Oracle的系统。很是有意思。为什么这么说呢？因为不同于Swing+JDBC的开发模式，系统之间多了一层(<a href="http://www.javadby.com/"><u>Java</u></a>Bean,姑且就这么叫吧！嘻嘻)；同时，很多开发技术和面向左面系统不一样，比如分页技术。<br />
&nbsp;&nbsp;&nbsp; 完成项目后，自己对于<a href="http://www.javadby.com/"><u>Java</u></a>的很多方面都比较了解了。开始思考一个问题，<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>是什么东西？。我们学习<a href="http://www.javadby.com/"><u>Java</u></a>大概有3个方向，第一，桌面系统，包括C/S结构；第二，J2ME,面向无限领域，很有潜力的家伙，看看中国的手机用户就知道了。第三，面向企业应用、计算的平台,<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>.<br />
&nbsp;&nbsp;&nbsp; 在痛苦的抉择后，我选择<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>..分享<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>给我带来的快乐。学到现在，最大的感觉，就是: 简单就是美，美就是<a href="http://www.javadby.com/"><u>Java</u></a>.不会有学MFC的痛苦，也不会有去分析STL的艰辛，网路应用上一点也不逊色于C++。开始进入我的<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>之旅。<br />
&nbsp;&nbsp;&nbsp; 还是下载了一份<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>规范，一份<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a> SDK。开始研究<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>,结合<a href="http://java.sun.com/j2ee/tutorial/index.html">http://java.sun.com/j2ee/tutorial/index.html</a> 提供的<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a> Tutorial开始研究了。大概过了1个月，开始有感觉了，也就在这个时候，需要我去完成一个<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>构架方面的项目。差不多边学编写完成了，很多概念在写完后都不是很清晰，因为东西太多了，主要是基于JSP(Servlet)+Session Bean+EIS构架开发系统。当然也学到很多东西，至少对SB&nbsp; EJB的编写不成问题。懂得了JSP如何调用EJB&#8230;&#8230;..<br />
&nbsp;&nbsp;&nbsp; 完成项目后，我开始研究<a href="http://www.javadby.com/"><u>Java</u></a> Pet Store了，很是过瘾。开始知道了Servlet过滤器，XML方面较为全面的知识，知道了<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>整个框架中各种技术的实际应用。慢慢的，开始研究WebLogic配置好的Pet Store（也是Sun公司的）。慢慢的分析两者的不同之处。开始对<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a> Specification有了很好的感觉。因为<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a> Specification本身是很严肃的，但Pet Store给出了活力。在反复的学习中，我明白了<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>构架的70?D80%。新的问题又出来了，实际企业中会如何建构一个<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>系统呢？带着这个问题，我开始分析Core <a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a> Patterns,这本书。同时，也有EJB Design Patterns。慢慢的，开始知道了<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>的魅力所在，知道了<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>为什么会在企业中得到较为好的认可。大家都知道，设计模式一词，在公司上班，你们的老板会看你的代码吗？会赞赏你的DP很好吗，我想很少。在完成你的工作进度之余，加班，加班，再加班，我想你没有更多的时间去分析研究DP.但，<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>框架不一样，她内置了很多优秀的设计模式，我们在设计开发、构架一个<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>系统中用到了很多设计模式。比如，MVC,EJB中封装的DAO设计模式。构架J2E系统用Session Fa&#231;ade,Message Fa&#231;ade设计模式也不会太困难。这也是后来<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>吸引我的地方。慢慢的我知道了，作为一个<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>开发者，我们要掌握其中的核心内容。我个人认为，3方面很重要。实施EJB系统常用的架构、设计模式，比如session fa&#231;ade、message fa&#231;ade、DTO等。<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>系统构架中常用的模式。UML-&gt; EJB,EJB-&gt;UML相互映射。现在也一样在研究。<br />
&nbsp;&nbsp;&nbsp; 善于享受孤独，幸好还有<a href="http://www.javadby.com/yuyanjichu/index.html"><u>J2EE</u></a>！</p>
<img src ="http://www.blogjava.net/blameswood/aggbug/150442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blameswood/" target="_blank">火焰出林</a> 2007-10-04 22:05 <a href="http://www.blogjava.net/blameswood/articles/150442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两种Java容器类List和Set分析比较 </title><link>http://www.blogjava.net/blameswood/articles/150441.html</link><dc:creator>火焰出林</dc:creator><author>火焰出林</author><pubDate>Thu, 04 Oct 2007 14:04:00 GMT</pubDate><guid>http://www.blogjava.net/blameswood/articles/150441.html</guid><wfw:comment>http://www.blogjava.net/blameswood/comments/150441.html</wfw:comment><comments>http://www.blogjava.net/blameswood/articles/150441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blameswood/comments/commentRss/150441.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blameswood/services/trackbacks/150441.html</trackback:ping><description><![CDATA[容器类可以大大提高编程效率和编程能力，在Java2中，所有的容器都由SUN公司的Joshua Bloch进行了重新设计，丰富了容器类库的功能。 <br />
<br />
　　Java2容器类类库的用途是&#8220;保存对象&#8221;，它分为两类： <br />
<br />
　　Collection----一组独立的元素，通常这些元素都服从某种规则。List必须保持元素特定的顺序，而Set不能有重复元素。 <br />
<br />
　　Map----一组成对的&#8220;键值对&#8221;对象，即其元素是成对的对象，最典型的应用就是数据字典，并且还有其它广泛的应用。另外，Map可以返回其所有键组成的Set和其所有值组成的Collection，或其键值对组成的Set，并且还可以像数组一样扩展多维Map，只要让Map中键值对的每个&#8220;值&#8221;是一个Map即可。 <br />
<br />
　　1.迭代器 <br />
<br />
　　迭代器是一种设计模式，它是一个对象，它可以遍历并选择序列中的对象，而开发人员不需要了解该序列的底层结构。迭代器通常被称为&#8220;轻量级&#8221;对象，因为创建它的代价小。 <br />
<br />
　　Java中的Iterator功能比较简单，并且只能单向移动： <br />
<br />
　　(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时，它返回序列的第一个元素。 <br />
<br />
　　(2) 使用next()获得序列中的下一个元素。 <br />
<br />
　　(3) 使用hasNext()检查序列中是否还有元素。 <br />
<br />
　　(4) 使用remove()将迭代器新返回的元素删除。 <br />
<br />
　　Iterator是Java迭代器最简单的实现，为List设计的ListIterator具有更多的功能，它可以从两个方向遍历List，也可以从List中插入和删除元素。 <br />
<br />
　　2.List的功能方法 <br />
<br />
　　List(interface): 次序是List最重要的特点；它确保维护元素特定的顺序。List为Collection添加了许多方法，使得能够向List中间插入与移除元素(只推荐LinkedList使用)。一个List可以生成ListIterator，使用它可以从两个方向遍历List，也可以从List中间插入和删除元素。 <br />
ArrayList: 由数组实现的List。它允许对元素进行快速随机访问，但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList，而不是用来插入和删除元素，因为这比LinkedList开销要大很多。 <br />
<br />
　　LinkedList: 对顺序访问进行了优化，向List中间插入与删除得开销不大，随机访问则相对较慢(可用ArrayList代替)。它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()，这些方法(没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。 <br />
<br />
　　3.Set的功能方法 <br />
<br />
　　Set(interface): 存入Set的每个元素必须是唯一的，因为Set不保存重复元素。加入Set的Object必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。 <br />
<br />
　　HashSet: 为快速查找而设计的Set。存入HashSet的对象必须定义hashCode()。 <br />
<br />
　　TreeSet: 保持次序的Set，底层为树结构。使用它可以从Set中提取有序的序列。 <br />
<br />
　　LinkedHashSet: 具有HashSet的查询速度，且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时，结果会按元素插入的次序显示。 <br />
<br />
　　HashSet采用散列函数对元素进行排序，这是专门为快速查询而设计的；TreeSet采用红黑树的数据结构进行排序元素；LinkedHashSet内部使用散列以加快查询速度，同时使用链表维护元素的次序，使得看起来元素是以插入的顺序保存的。需要注意的是，生成自己的类时，Set需要维护元素的存储顺序，因此要实现Comparable接口并定义compareTo()方法。 
<img src ="http://www.blogjava.net/blameswood/aggbug/150441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blameswood/" target="_blank">火焰出林</a> 2007-10-04 22:04 <a href="http://www.blogjava.net/blameswood/articles/150441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谈谈Java集合框架 </title><link>http://www.blogjava.net/blameswood/articles/150440.html</link><dc:creator>火焰出林</dc:creator><author>火焰出林</author><pubDate>Thu, 04 Oct 2007 14:03:00 GMT</pubDate><guid>http://www.blogjava.net/blameswood/articles/150440.html</guid><wfw:comment>http://www.blogjava.net/blameswood/comments/150440.html</wfw:comment><comments>http://www.blogjava.net/blameswood/articles/150440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blameswood/comments/commentRss/150440.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blameswood/services/trackbacks/150440.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><a title="Java" href="http://www.vipcn.com/InfoList/Catalog_251_1.html" target="_blank">Java</a>提供了数种持有对象的方式，包括语言内置的Array，还有就是utilities中提供的容器类(container classes)，又称群集类(collection classes)。集合在java中非常重要，在讨论之前，先来看几个面试中的经典问题。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">1 Collection 和 Collections的区别。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">2 List, Set, Map是否继承自Collection接口。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">3 ArrayList和Vector的区别。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">4 HashMap和Hashtable的区别。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">篇尾有答案，我们开始正题。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><O:P>&nbsp;</O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">集合Collection接口<O:P></O:P></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">--Collection 是任何对象组，元素各自独立，通常拥有相同的套用规则。Set List由它派生。<br />
<O:P>基本操作&nbsp; 增加元素add(Object obj); addAll(Collection c);<O:P></O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 45pt; text-align: left; mso-pagination: widow-orphan; mso-char-indent-count: 5.0" align="left">删除元素 remove(Object obj);&nbsp; removeAll(Collection c);<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 45pt; text-align: left; mso-pagination: widow-orphan; mso-char-indent-count: 5.0" align="left">求交集 retainAll(Collection c);<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">访问/遍历集合元素的好办法是使用Iterator接口(迭代器用于取代Enumeration)<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">Public interface<strong style="mso-bidi-font-weight: normal"> Iterator</strong>{<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp; Public Boolean hasNext(0;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">Public Object next(0;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">Public void remove(0;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">}<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><O:P>&nbsp;</O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">集set<O:P></O:P></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">--没有重复项目的集合<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">有三种特定类型的集可用<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">HashSet</strong>-基于散列表的集，加进散列表的元素要实现hashCode()方法<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">LinkedHashSet</strong>-对集迭代时，按增加顺序返回元素<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">TreeSet</strong>-基于（平衡）树的<a title="数据结构" href="http://www.vipcn.com/InfoList/Catalog_255_1.html" target="_blank">数据结构</a><O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><O:P>&nbsp;</O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">清单List<O:P></O:P></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">--位置性集合。加进清单的元素可以加在清单中特定位置或加到末尾<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">有两个特定版本<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left"><strong style="mso-bidi-font-weight: normal">ArrayList(</strong><strong style="mso-bidi-font-weight: normal">数组表)</strong>-类似于Vector，都用于缩放数组维护集合。区别：<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left">一.同步性:Vector是线程<a title="网络安全资讯" href="http://www.vipcn.com/InfoList/Catalog_59_1.html" target="_blank">安全</a>的，也就是说是同步的，而ArrayList是线程序不安全的，不是同步的&nbsp;<br />
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">学集合其实是因为我要研究泛型，苦于作为前提的集合还没学懂，所以就先来搞搞它吧。<!-- href="http://www.vipcn.com/InfoList/Catalog_83_1.html" target="_blank" title="XML学习教程-->XML:namespace prefix = o ns = "urn:schemas-microsoft-com:<a title="Office相关知识技巧" href="http://www.vipcn.com/InfoList/Catalog_56_1.html" target="_blank">Office</a>:office" /&gt;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 8.85pt"><O:P>&nbsp;</O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><a title="Java" href="http://www.vipcn.com/InfoList/Catalog_251_1.html" target="_blank">Java</a>提供了数种持有对象的方式，包括语言内置的Array，还有就是utilities中提供的容器类(container classes)，又称群集类(collection classes)。集合在java中非常重要，在讨论之前，先来看几个面试中的经典问题。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">1 Collection 和 Collections的区别。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">2 List, Set, Map是否继承自Collection接口。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">3 ArrayList和Vector的区别。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">4 HashMap和Hashtable的区别。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">篇尾有答案，我们开始正题。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><O:P>&nbsp;</O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">集合Collection接口<O:P></O:P></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">--Collection 是任何对象组，元素各自独立，通常拥有相同的套用规则。Set List由它派生。<br />
<O:P>基本操作&nbsp; 增加元素add(Object obj); addAll(Collection c);<O:P></O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 45pt; text-align: left; mso-pagination: widow-orphan; mso-char-indent-count: 5.0" align="left">删除元素 remove(Object obj);&nbsp; removeAll(Collection c);<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 45pt; text-align: left; mso-pagination: widow-orphan; mso-char-indent-count: 5.0" align="left">求交集 retainAll(Collection c);<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">访问/遍历集合元素的好办法是使用Iterator接口(迭代器用于取代Enumeration)<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">Public interface<strong style="mso-bidi-font-weight: normal"> Iterator</strong>{<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp; Public Boolean hasNext(0;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">Public Object next(0;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">Public void remove(0;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">}<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><O:P>&nbsp;</O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">集set<O:P></O:P></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">--没有重复项目的集合<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">有三种特定类型的集可用<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">HashSet</strong>-基于散列表的集，加进散列表的元素要实现hashCode()方法<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">LinkedHashSet</strong>-对集迭代时，按增加顺序返回元素<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">TreeSet</strong>-基于（平衡）树的<a title="数据结构" href="http://www.vipcn.com/InfoList/Catalog_255_1.html" target="_blank">数据结构</a><O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><O:P>&nbsp;</O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">清单List<O:P></O:P></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">--位置性集合。加进清单的元素可以加在清单中特定位置或加到末尾<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">有两个特定版本<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left"><strong style="mso-bidi-font-weight: normal">ArrayList(</strong><strong style="mso-bidi-font-weight: normal">数组表)</strong>-类似于Vector，都用于缩放数组维护集合。区别：<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left">一.同步性:Vector是线程<a title="网络安全资讯" href="http://www.vipcn.com/InfoList/Catalog_59_1.html" target="_blank">安全</a>的，也就是说是同步的，而ArrayList是线程序不安全的，不是同步的&nbsp;<br />
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">学集合其实是因为我要研究泛型，苦于作为前提的集合还没学懂，所以就先来搞搞它吧。<!-- href="http://www.vipcn.com/InfoList/Catalog_83_1.html" target="_blank" title="XML学习教程-->XML:namespace prefix = o ns = "urn:schemas-microsoft-com:<a title="Office相关知识技巧" href="http://www.vipcn.com/InfoList/Catalog_56_1.html" target="_blank">Office</a>:office" /&gt;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 8.85pt"><O:P>&nbsp;</O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><a title="Java" href="http://www.vipcn.com/InfoList/Catalog_251_1.html" target="_blank">Java</a>提供了数种持有对象的方式，包括语言内置的Array，还有就是utilities中提供的容器类(container classes)，又称群集类(collection classes)。集合在java中非常重要，在讨论之前，先来看几个面试中的经典问题。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">1 Collection 和 Collections的区别。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">2 List, Set, Map是否继承自Collection接口。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">3 ArrayList和Vector的区别。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">4 HashMap和Hashtable的区别。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.6pt">篇尾有答案，我们开始正题。<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><O:P>&nbsp;</O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">集合Collection接口<O:P></O:P></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">--Collection 是任何对象组，元素各自独立，通常拥有相同的套用规则。Set List由它派生。<br />
<O:P>基本操作&nbsp; 增加元素add(Object obj); addAll(Collection c);<O:P></O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 45pt; text-align: left; mso-pagination: widow-orphan; mso-char-indent-count: 5.0" align="left">删除元素 remove(Object obj);&nbsp; removeAll(Collection c);<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 45pt; text-align: left; mso-pagination: widow-orphan; mso-char-indent-count: 5.0" align="left">求交集 retainAll(Collection c);<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">访问/遍历集合元素的好办法是使用Iterator接口(迭代器用于取代Enumeration)<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">Public interface<strong style="mso-bidi-font-weight: normal"> Iterator</strong>{<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp; Public Boolean hasNext(0;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">Public Object next(0;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">Public void remove(0;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">}<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><O:P>&nbsp;</O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">集set<O:P></O:P></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">--没有重复项目的集合<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">有三种特定类型的集可用<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">HashSet</strong>-基于散列表的集，加进散列表的元素要实现hashCode()方法<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">LinkedHashSet</strong>-对集迭代时，按增加顺序返回元素<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">TreeSet</strong>-基于（平衡）树的<a title="数据结构" href="http://www.vipcn.com/InfoList/Catalog_255_1.html" target="_blank">数据结构</a><O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><O:P>&nbsp;</O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal">清单List<O:P></O:P></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">--位置性集合。加进清单的元素可以加在清单中特定位置或加到末尾<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt">有两个特定版本<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left"><strong style="mso-bidi-font-weight: normal">ArrayList(</strong><strong style="mso-bidi-font-weight: normal">数组表)</strong>-类似于Vector，都用于缩放数组维护集合。区别：<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left">一.同步性:Vector是线程<a title="网络安全资讯" href="http://www.vipcn.com/InfoList/Catalog_59_1.html" target="_blank">安全</a>的，也就是说是同步的，而ArrayList是线程序不安全的，不是同步的&nbsp;<br />
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left">二.数据增长:当需要增长时,Vector默认增长为原来一培，而ArrayList却是原来的一半<O:P></O:P> </p>
<p>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left">HashMap和Hashtable的区别&nbsp;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left">一.历史原因:Hashtable是基于陈旧的Dictionary类的，HashMap是Java&nbsp;1.2引进的Map接口的一个实现&nbsp;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left">二.同步性:Hashtable是线程安全的，也就是说是同步的，而HashMap是线程序不安全的，不是同步的&nbsp;<O:P></O:P></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan" align="left">三.值：只有HashMap可以让你将空值作为一个表的条目的key或value&nbsp;<br />
<strong style="mso-bidi-font-weight: normal">参考《Mastering Java2 J2SE1.4 》By Zukowshi</strong><strong style="mso-bidi-font-weight: normal">&nbsp;&nbsp;&nbsp;《Thinking in Java》By Br<a title="UC  下载" href="http://www.vipcn.com/SoftView/SoftView_10517.html" target="_blank">UC</a>e Eckel</strong></p>
<img src ="http://www.blogjava.net/blameswood/aggbug/150440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blameswood/" target="_blank">火焰出林</a> 2007-10-04 22:03 <a href="http://www.blogjava.net/blameswood/articles/150440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>