﻿<?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-Java Tech. Drops</title><link>http://www.blogjava.net/cooperlee321/</link><description>知行合一</description><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 10:35:57 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 10:35:57 GMT</pubDate><ttl>60</ttl><item><title>Java Plugin Detector</title><link>http://www.blogjava.net/cooperlee321/archive/2010/09/21/332551.html</link><dc:creator>梧桐夜雨</dc:creator><author>梧桐夜雨</author><pubDate>Mon, 20 Sep 2010 16:16:00 GMT</pubDate><guid>http://www.blogjava.net/cooperlee321/archive/2010/09/21/332551.html</guid><wfw:comment>http://www.blogjava.net/cooperlee321/comments/332551.html</wfw:comment><comments>http://www.blogjava.net/cooperlee321/archive/2010/09/21/332551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cooperlee321/comments/commentRss/332551.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cooperlee321/services/trackbacks/332551.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://www.pinlady.net/PluginDetect/JavaDetect.htmJava Plugin Detector[This detector can perform both OTF and NOTF Java detection]Java (using &lt;applet&gt; and/or &lt;object&gt; tag) inst...&nbsp;&nbsp;<a href='http://www.blogjava.net/cooperlee321/archive/2010/09/21/332551.html'>阅读全文</a><img src ="http://www.blogjava.net/cooperlee321/aggbug/332551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cooperlee321/" target="_blank">梧桐夜雨</a> 2010-09-21 00:16 <a href="http://www.blogjava.net/cooperlee321/archive/2010/09/21/332551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JWS在使用中遇到的一个bug跟踪</title><link>http://www.blogjava.net/cooperlee321/archive/2010/08/12/328721.html</link><dc:creator>梧桐夜雨</dc:creator><author>梧桐夜雨</author><pubDate>Thu, 12 Aug 2010 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/cooperlee321/archive/2010/08/12/328721.html</guid><wfw:comment>http://www.blogjava.net/cooperlee321/comments/328721.html</wfw:comment><comments>http://www.blogjava.net/cooperlee321/archive/2010/08/12/328721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cooperlee321/comments/commentRss/328721.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cooperlee321/services/trackbacks/328721.html</trackback:ping><description><![CDATA[<span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; ">Our primary use case also has the user switching between online and offline, so these bugs are a big problem.</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; "><br />
</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; "><br />
</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; ">I threw the full weight of my three bug votes behind bug 6931553 ;)</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; "><br />
</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; "><br />
</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; ">The fix for bug 6911785 does seem to prevent the endless "hang" on launch (with an active TCP/IP connection but no internet access), but there are still lots of problems:</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; "><br />
</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; ">- launching without internet access can take 20s - 2 minutes!</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; "><br />
</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; ">- launching offline results in the non-sensical "this application has requested to go online" dialog</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; "><br />
</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; ">- the JNLPClassLoader ends up doing DNS lookups which occasionally cause long delays during execution</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; "><br />
</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; "><br />
</span><span  style="font-family: arial, helvetica, sans-serif; font-size: 13px; ">It's really ugly. We have unhappy customers. I have no idea how to get these bugs fixed. Any suggestions?</span>
<br />
<div><font  face="arial, helvetica, sans-serif" size="3"><span  style="font-size: 13px; "><a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6931553"><span  style="color: #000000; font-family: Simsun; font-size: medium; "><a href="http://forums.sun.com/thread.jspa?threadID=5426321&amp;start=0&amp;tstart=0">http://forums.sun.com/thread.jspa?threadID=5426321&amp;start=0&amp;tstart=0</a><br />
</span><font  color="#000000" face="Simsun"><span  style="font-size: medium;"><br />
</span></font>http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6931553</a></span></font></div>
<img src ="http://www.blogjava.net/cooperlee321/aggbug/328721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cooperlee321/" target="_blank">梧桐夜雨</a> 2010-08-12 23:49 <a href="http://www.blogjava.net/cooperlee321/archive/2010/08/12/328721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用ant构建c++ 程序</title><link>http://www.blogjava.net/cooperlee321/archive/2010/05/06/320240.html</link><dc:creator>梧桐夜雨</dc:creator><author>梧桐夜雨</author><pubDate>Thu, 06 May 2010 15:52:00 GMT</pubDate><guid>http://www.blogjava.net/cooperlee321/archive/2010/05/06/320240.html</guid><wfw:comment>http://www.blogjava.net/cooperlee321/comments/320240.html</wfw:comment><comments>http://www.blogjava.net/cooperlee321/archive/2010/05/06/320240.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cooperlee321/comments/commentRss/320240.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cooperlee321/services/trackbacks/320240.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/cooperlee321/archive/2010/05/06/320240.html'>阅读全文</a><img src ="http://www.blogjava.net/cooperlee321/aggbug/320240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cooperlee321/" target="_blank">梧桐夜雨</a> 2010-05-06 23:52 <a href="http://www.blogjava.net/cooperlee321/archive/2010/05/06/320240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClassLoader 与 JAVA类加密技术</title><link>http://www.blogjava.net/cooperlee321/archive/2010/04/01/317240.html</link><dc:creator>梧桐夜雨</dc:creator><author>梧桐夜雨</author><pubDate>Thu, 01 Apr 2010 14:52:00 GMT</pubDate><guid>http://www.blogjava.net/cooperlee321/archive/2010/04/01/317240.html</guid><wfw:comment>http://www.blogjava.net/cooperlee321/comments/317240.html</wfw:comment><comments>http://www.blogjava.net/cooperlee321/archive/2010/04/01/317240.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cooperlee321/comments/commentRss/317240.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cooperlee321/services/trackbacks/317240.html</trackback:ping><description><![CDATA[了解ClassLoader<br />
1，&nbsp;&nbsp; 什么是 ClassLoader? <br />
&nbsp; &nbsp; Java
程序并不是一个可执行文件，是需要的时候，才把装载到 JVM中。ClassLoader 做的工作就是 JVM 中将类装入内存。 而且，Java
ClassLoader 就是用 Java 语言编写的。这意味着您可以创建自己的 ClassLoader <br />
&nbsp; &nbsp;
ClassLoader 的基本目标是对类的请求提供服务。当 JVM 需要使用类时，它根据名称向 ClassLoader 请求这个类，然后
ClassLoader 试图返回一个表示这个类的 Class 对象。 通过覆盖对应于这个过程不同阶段的方法，可以创建定制的
ClassLoader。<br />
2， 一些重要的方法<br />
A)&nbsp; 方法 loadClass <br />
&nbsp; &nbsp; &nbsp; &nbsp; ClassLoader.loadClass() 是 ClassLoader 的入口点。该方法的定义如下： <br />
&nbsp; &nbsp; &nbsp; &nbsp; Class loadClass( String name, boolean resolve );<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; name&nbsp; JVM 需要的类的名称，如 Foo 或 java.lang.Object。<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; resolve 参数告诉方法是否需要解析类。在准备执行类之前，应考虑类解析。并不总是需要解析。如果 JVM 只需要知道该类是否存在或找出该类的超类，那么就不需要解析。 <br />
&nbsp; &nbsp;&nbsp; <br />
&nbsp; &nbsp; <!--emo&b)--><img src="http://www.loveunix.net/style_emoticons/default/cool.gif" style="vertical-align: middle;" alt="cool.gif" border="0" /><!--endemo-->&nbsp; 方法 defineClass <br />
&nbsp;
&nbsp; &nbsp;&nbsp; defineClass 方法是 ClassLoader 的主要诀窍。该方法接受由原始字节组成的数组并把它转换成 Class
对象。原始数组包含如从文件系统或网络装入的数据。defineClass 管理 JVM 的许多复杂、神秘和倚赖于实现的方面 --
它把字节码分析成运行时数据结构、校验有效性等等。不必担心，您无需亲自编写它。事实上，即使您想要这么做也不能覆盖它，因为它已被标记成final的。
<br />
<br />
&nbsp; &nbsp; C)&nbsp; 方法 findSystemClass <br />
&nbsp; &nbsp; &nbsp;&nbsp; findSystemClass
方法从本地文件系统装入文件。它在本地文件系统中寻找类文件，如果存在，就使用 defineClass 将原始字节转换成 Class
对象，以将该文件转换成类。当运行 Java 应用程序时，这是 JVM 正常装入类的缺省机制。（Java 2 中 ClassLoader
的变动提供了关于 Java 版本 1.2 这个过程变动的详细信息。） 对于定制的 ClassLoader，只有在尝试其它方法装入类之后，再使用
findSystemClass。原因很简单：ClassLoader 是负责执行装入类的特殊步骤，不是负责所有类。例如，即使
ClassLoader 从远程的 Web 站点装入了某些类，仍然需要在本地机器上装入大量的基本 Java 库。而这些类不是我们所关心的，所以要
JVM 以缺省方式装入它们：从本地文件系统。这就是 findSystemClass 的用途。 <br />
<br />
&nbsp; &nbsp;&nbsp; D) 方法 resolveClass <br />
&nbsp;&nbsp; 正如前面所提到的，可以不完全地（不带解析）装入类，也可以完全地（带解析）装入类。当编写我们自己的 loadClass 时，可以调用 resolveClass，这取决于 loadClass 的 resolve 参数的值。 <br />
<br />
<br />
&nbsp;&nbsp; E) 方法 findLoadedClass <br />
&nbsp; &nbsp; &nbsp; findLoadedClass 充当一个缓存：当请求 loadClass 装入类时，它调用该方法来查看 ClassLoader 是否已装入这个类，这样可以避免重新装入已存在类所造成的麻烦。应首先调用该方法。<br />
<br />
3， 怎么组装这些方法 <br />
&nbsp; 1） 调用 findLoadedClass 来查看是否存在已装入的类。<br />
&nbsp; 2） 如果没有，那么采用那种特殊的神奇方式来获取原始字节。<br />
&nbsp; 3） 如果已有原始字节，调用 defineClass 将它们转换成 Class 对象。<br />
&nbsp; 4） 如果没有原始字节，然后调用 findSystemClass 查看是否从本地文件系统获取类。<br />
&nbsp; 5） 如果 resolve 参数是 true，那么调用 resolveClass 解析 Class 对象。<br />
&nbsp; 6） 如果还没有类，返回 ClassNotFoundException。<br />
<br />
4，Java 2 中 ClassLoader 的变动<br />
1）loadClass 的缺省实现 <br />
&nbsp;&nbsp;
定制编写的 loadClass 方法一般尝试几种方式来装入所请求的类，如果您编写许多类，会发现一次次地在相同的、很复杂的方法上编写变量。 在
Java 1.2 中 loadClass 的实现嵌入了大多数查找类的一般方法，并使您通过覆盖 findClass 方法来定制它，在适当的时候
findClass 会调用 loadClass。 这种方式的好处是您可能不一定要覆盖 loadClass；只要覆盖 findClass
就行了，这减少了工作量。 <br />
<br />
2）新方法：findClass<br />
&nbsp; &nbsp;&nbsp; loadClass 的缺省实现调用这个新方法。findClass 的用途包含您的 ClassLoader 的所有特殊代码，而无需要复制其它代码（例如，当专门的方法失败时，调用系统 ClassLoader）。 <br />
<br />
3） 新方法：getSystemClassLoader <br />
&nbsp; &nbsp;&nbsp; 如果覆盖 findClass 或 loadClass，getSystemClassLoader 使您能以实际 ClassLoader 对象来访问系统 ClassLoader（而不是固定的从 findSystemClass 调用它）。 <br />
&nbsp; <br />
4） 新方法：getParent&nbsp; <br />
&nbsp; &nbsp; 为了将类请求委托给父代 ClassLoader，这个新方法允许 ClassLoader 获取它的父代 ClassLoader。当使用特殊方法，定制的 ClassLoader 不能找到类时，可以使用这种方法。<br />
父代 ClassLoader 被定义成创建该 ClassLoader 所包含代码的对象的 ClassLoader。<br />
运用加密技术保护Java源代码<br />
<!--quotebegin-->
<div class="quotetop">QUOTE</div>
<!--quoteebegin-->Java程序的源代码很容易被别人偷看。只要有一个反编译器，任何人都可以分析别人的代码。本文讨论如何在不修改原有程序的情况下，通过加密技术保护源代码。<br />
一、为什么要加密？<br />
对
于传统的C或C++之类的语言来说，要在Web上保护源代码是很容易的，只要不发布它就可以。遗憾的是，Java程序的源代码很容易被别人偷看。只要有一
个反编译器，任何人都可以分析别人的代码。Java的灵活性使得源代码很容易被窃取，但与此同时，它也使通过加密保护代码变得相对容易，我们唯一需要了解
的就是Java的ClassLoader对象。当然，在加密过程中，有关Java Cryptography
Extension（JCE）的知识也是必不可少的。<br />
<br />
有几种技术可以&#8220;模糊&#8221;Java类文件，使得反编译器处理类文件的效果大打折扣。然而，修改反编译器使之能够处理这些经过模糊处理的类文件并不是什么难事，所以不能简单地依赖模糊技术来保证源代码的安全。<br />
<br />
我们可以用流行的加密工具加密应用，比如PGP（Pretty Good Privacy）或GPG（GNU Privacy Guard）。这时，最终用户在运行应用之前必须先进行解密。但解密之后，最终用户就有了一份不加密的类文件，这和事先不进行加密没有什么差别。<br />
<br />
Java
运行时装入字节码的机制隐含地意味着可以对字节码进行修改。JVM每次装入类文件时都需要一个称为ClassLoader的对象，这个对象负责把新的类装
入正在运行的JVM。JVM给ClassLoader一个包含了待装入类（比如java.lang.Object）名字的字符串，然后由
ClassLoader负责找到类文件，装入原始数据，并把它转换成一个Class对象。<br />
<br />
我们可以通过定制ClassLoader，在类文件执行之前修改它。这种技术的应用非常广泛——在这里，它的用途是在类文件装入之时进行解密，因此可以看成是一种即时解密器。由于解密后的字节码文件永远不会保存到文件系统，所以窃密者很难得到解密后的代码。<br />
<br />
由于把原始字节码转换成Class对象的过程完全由系统负责，所以创建定制ClassLoader对象其实并不困难，只需先获得原始数据，接着就可以进行包含解密在内的任何转换。<br />
<br />
Java 2在一定程度上简化了定制ClassLoader的构建。在Java 2中，loadClass的缺省实现仍旧负责处理所有必需的步骤，但为了顾及各种定制的类装入过程，它还调用一个新的findClass方法。<br />
<br />
这为我们编写定制的ClassLoader提供了一条捷径，减少了麻烦：只需覆盖findClass，而不是覆盖loadClass。这种方法避免了重复所有装入器必需执行的公共步骤，因为这一切由loadClass负责。<br />
<br />
不
过，本文的定制ClassLoader并不使用这种方法。原因很简单。如果由默认的ClassLoader先寻找经过加密的类文件，它可以找到；但由于类
文件已经加密，所以它不会认可这个类文件，装入过程将失败。因此，我们必须自己实现loadClass，稍微增加了一些工作量。<br />
<br />
二、定制类装入器<br />
每一个运行着的JVM已经拥有一个ClassLoader。这个默认的ClassLoader根据CLASSPATH环境变量的值，在本地文件系统中寻找合适的字节码文件。<br />
<br />
应
用定制ClassLoader要求对这个过程有较为深入的认识。我们首先必须创建一个定制ClassLoader类的实例，然后显式地要求它装入另外一个
类。这就强制JVM把该类以及所有它所需要的类关联到定制的ClassLoader。Listing
1显示了如何用定制ClassLoader装入类文件。<br />
<br />
【Listing 1：利用定制的ClassLoader装入类文件】<br />
<br />
&nbsp; // 首先创建一个ClassLoader对象<br />
&nbsp; ClassLoader myClassLoader = new myClassLoader();<br />
<br />
&nbsp; // 利用定制ClassLoader对象装入类文件<br />
&nbsp; // 并把它转换成Class对象<br />
&nbsp; Class myClass = myClassLoader.loadClass( "mypackage.MyClass" );<br />
<br />
&nbsp; // 最后，创建该类的一个实例<br />
&nbsp; Object newInstance = myClass.newInstance();<br />
<br />
&nbsp; // 注意，MyClass所需要的所有其他类，都将通过<br />
&nbsp; // 定制的ClassLoader自动装入<br />
<br />
<br />
<br />
<br />
<br />
<br />
如前所述，定制ClassLoader只需先获取类文件的数据，然后把字节码传递给运行时系统，由后者完成余下的任务。<br />
<br />
ClassLoader
有几个重要的方法。创建定制的ClassLoader时，我们只需覆盖其中的一个，即loadClass，提供获取原始类文件数据的代码。这个方法有两个
参数：类的名字，以及一个表示JVM是否要求解析类名字的标记（即是否同时装入有依赖关系的类）。如果这个标记是true，我们只需在返回JVM之前调用
resolveClass。<br />
<br />
【Listing 2：ClassLoader.loadClass()的一个简单实现】<br />
<br />
&nbsp; &nbsp; &nbsp; public Class loadClass( String name, boolean resolve )<br />
&nbsp; &nbsp; &nbsp; throws ClassNotFoundException {<br />
&nbsp; &nbsp; try {<br />
&nbsp; &nbsp; &nbsp; // 我们要创建的Class对象<br />
&nbsp; &nbsp; &nbsp;&nbsp; Class clasz = null;<br />
<br />
&nbsp; &nbsp; &nbsp; // 必需的步骤1：如果类已经在系统缓冲之中，<br />
&nbsp; &nbsp; &nbsp; // 我们不必再次装入它<br />
&nbsp; &nbsp; &nbsp; clasz = findLoadedClass( name );<br />
<br />
&nbsp; &nbsp; &nbsp; if (clasz != null)<br />
&nbsp; &nbsp; &nbsp; &nbsp; return clasz;<br />
<br />
&nbsp; &nbsp; &nbsp; // 下面是定制部分<br />
&nbsp; &nbsp; &nbsp; byte classData[] = /* 通过某种方法获取字节码数据 */;<br />
&nbsp; &nbsp; &nbsp; if (classData != null) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; // 成功读取字节码数据，现在把它转换成一个Class对象<br />
&nbsp; &nbsp; &nbsp; &nbsp; clasz = defineClass( name, classData, 0, classData.length );<br />
&nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; // 必需的步骤2：如果上面没有成功，<br />
&nbsp; &nbsp; &nbsp; // 我们尝试用默认的ClassLoader装入它<br />
&nbsp; &nbsp; &nbsp; if (clasz == null)<br />
&nbsp; &nbsp; &nbsp; &nbsp; clasz = findSystemClass( name );<br />
<br />
&nbsp; &nbsp; &nbsp; // 必需的步骤3：如有必要，则装入相关的类<br />
&nbsp; &nbsp; &nbsp; if (resolve &amp;&amp; clasz != null)<br />
&nbsp; &nbsp; &nbsp; &nbsp; resolveClass( clasz );<br />
<br />
&nbsp; &nbsp; &nbsp; // 把类返回给调用者<br />
&nbsp; &nbsp; &nbsp; return clasz;<br />
<br />
&nbsp; &nbsp; } catch( IOException ie ) {<br />
&nbsp; &nbsp; &nbsp; throw new ClassNotFoundException( ie.toString() );<br />
&nbsp; &nbsp; } catch( GeneralSecurityException gse ) {<br />
&nbsp; &nbsp; &nbsp; throw new ClassNotFoundException( gse.toString() );<br />
&nbsp; &nbsp; }<br />
&nbsp; }<br />
<br />
<br />
<br />
<br />
<br />
<br />
Listing 2显示了一个简单的loadClass实现。代码中的大部分对所有ClassLoader对象来说都一样，但有一小部分（已通过注释标记）是特有的。在处理过程中，ClassLoader对象要用到其他几个辅助方法：<br />
<br />
findLoadedClass：用来进行检查，以便确认被请求的类当前还不存在。loadClass方法应该首先调用它。 <br />
defineClass：获得原始类文件字节码数据之后，调用defineClass把它转换成一个Class对象。任何loadClass实现都必须调用这个方法。 <br />
findSystemClass：提供默认ClassLoader的支持。如果用来寻找类的定制方法不能找到指定的类（或者有意地不用定制方法），则可以调用该方法尝试默认的装入方式。这是很有用的，特别是从普通的JAR文件装入标准Java类时。 <br />
resolveClass：当JVM想要装入的不仅包括指定的类，而且还包括该类引用的所有其他类时，它会把loadClass的resolve参数设置成true。这时，我们必须在返回刚刚装入的Class对象给调用者之前调用resolveClass。 <br />
<br />
<br />
<br />
三、加密、解密<br />
Java加密扩展即Java Cryptography Extension，简称JCE。它是Sun的加密服务软件，包含了加密和密匙生成功能。JCE是JCA（Java Cryptography Architecture）的一种扩展。<br />
<br />
JCE
没有规定具体的加密算法，但提供了一个框架，加密算法的具体实现可以作为服务提供者加入。除了JCE框架之外，JCE软件包还包含了SunJCE服务提供
者，其中包括许多有用的加密算法，比如DES（Data Encryption Standard）和Blowfish。<br />
<br />
为简单计，在本文中我们将用DES算法加密和解密字节码。下面是用JCE加密和解密数据必须遵循的基本步骤：<br />
<br />
步骤1：生成一个安全密匙。在加密或解密任何数据之前需要有一个密匙。密匙是随同被加密的应用一起发布的一小段数据，Listing 3显示了如何生成一个密匙。 【Listing 3：生成一个密匙】<br />
<br />
&nbsp; // DES算法要求有一个可信任的随机数源<br />
&nbsp; SecureRandom sr = new SecureRandom();<br />
<br />
&nbsp; // 为我们选择的DES算法生成一个KeyGenerator对象<br />
&nbsp; KeyGenerator kg = KeyGenerator.getInstance( "DES" );<br />
&nbsp; kg.init( sr );<br />
<br />
&nbsp; // 生成密匙<br />
&nbsp; SecretKey key = kg.generateKey();<br />
<br />
&nbsp; // 获取密匙数据<br />
&nbsp; byte rawKeyData[] = key.getEncoded();<br />
<br />
&nbsp; /* 接下来就可以用密匙进行加密或解密，或者把它保存<br />
&nbsp; &nbsp;&nbsp; 为文件供以后使用 */<br />
&nbsp; doSomething( rawKeyData );<br />
<br />
<br />
<br />
<br />
步骤2：加密数据。得到密匙之后，接下来就可以用它加密数据。除了解密的ClassLoader之外，一般还要有一个加密待发布应用的独立程序（见Listing 4）。 【Listing 4：用密匙加密原始数据】<br />
<br />
&nbsp; &nbsp; // DES算法要求有一个可信任的随机数源<br />
&nbsp; &nbsp; SecureRandom sr = new SecureRandom();<br />
<br />
&nbsp; &nbsp; byte rawKeyData[] = /* 用某种方法获得密匙数据 */;<br />
<br />
&nbsp; &nbsp; // 从原始密匙数据创建DESKeySpec对象<br />
&nbsp; &nbsp; DESKeySpec dks = new DESKeySpec( rawKeyData );<br />
<br />
&nbsp; &nbsp; // 创建一个密匙工厂，然后用它把DESKeySpec转换成<br />
&nbsp; &nbsp; // 一个SecretKey对象<br />
&nbsp; &nbsp; SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" );<br />
&nbsp; &nbsp; SecretKey key = keyFactory.generateSecret( dks );<br />
<br />
&nbsp; &nbsp; // Cipher对象实际完成加密操作<br />
&nbsp; &nbsp; Cipher cipher = Cipher.getInstance( "DES" );<br />
<br />
&nbsp; &nbsp; // 用密匙初始化Cipher对象<br />
&nbsp; &nbsp; cipher.init( Cipher.ENCRYPT_MODE, key, sr );<br />
<br />
&nbsp; &nbsp; // 现在，获取数据并加密<br />
&nbsp; &nbsp; byte data[] = /* 用某种方法获取数据 */<br />
<br />
&nbsp; &nbsp; // 正式执行加密操作<br />
&nbsp; &nbsp; byte encryptedData[] = cipher.doFinal( data );<br />
<br />
&nbsp; &nbsp; // 进一步处理加密后的数据<br />
&nbsp; &nbsp; doSomething( encryptedData );<br />
<br />
<br />
<br />
步骤3：解密数据。运行经过加密的应用时，ClassLoader分析并解密类文件。操作步骤如Listing 5所示。 【Listing 5：用密匙解密数据】<br />
<br />
&nbsp; &nbsp; // DES算法要求有一个可信任的随机数源<br />
&nbsp; &nbsp; SecureRandom sr = new SecureRandom();<br />
<br />
&nbsp; &nbsp; byte rawKeyData[] = /* 用某种方法获取原始密匙数据 */;<br />
<br />
&nbsp; &nbsp; // 从原始密匙数据创建一个DESKeySpec对象<br />
&nbsp; &nbsp; DESKeySpec dks = new DESKeySpec( rawKeyData );<br />
<br />
&nbsp; &nbsp; // 创建一个密匙工厂，然后用它把DESKeySpec对象转换成<br />
&nbsp; &nbsp; // 一个SecretKey对象<br />
&nbsp; &nbsp; SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" );<br />
&nbsp; &nbsp; SecretKey key = keyFactory.generateSecret( dks );<br />
<br />
&nbsp; &nbsp; // Cipher对象实际完成解密操作<br />
&nbsp; &nbsp; Cipher cipher = Cipher.getInstance( "DES" );<br />
<br />
&nbsp; &nbsp; // 用密匙初始化Cipher对象<br />
&nbsp; &nbsp; cipher.init( Cipher.DECRYPT_MODE, key, sr );<br />
<br />
&nbsp; &nbsp; // 现在，获取数据并解密<br />
&nbsp; &nbsp; byte encryptedData[] = /* 获得经过加密的数据 */<br />
<br />
&nbsp; &nbsp; // 正式执行解密操作<br />
&nbsp; &nbsp; byte decryptedData[] = cipher.doFinal( encryptedData );<br />
<br />
&nbsp; &nbsp; // 进一步处理解密后的数据<br />
&nbsp; &nbsp; doSomething( decryptedData );<br />
<br />
<br />
<br />
四、应用实例<br />
前面介绍了如何加密和解密数据。要部署一个经过加密的应用，步骤如下：<br />
<br />
步骤1：创建应用。我们的例子包含一个App主类，两个辅助类（分别称为Foo和Bar）。这个应用没有什么实际功用，但只要我们能够加密这个应用，加密其他应用也就不在话下。 <br />
步骤2：生成一个安全密匙。在命令行，利用GenerateKey工具（参见GenerateKey.java）把密匙写入一个文件： % java GenerateKey key.data<br />
<br />
<br />
<br />
步骤3：加密应用。在命令行，利用EncryptClasses工具（参见EncryptClasses.java）加密应用的类： % java EncryptClasses key.data App.class Foo.class Bar.class<br />
<br />
<br />
该命令把每一个.class文件替换成它们各自的加密版本。 <br />
步骤4：运行经过加密的应用。用户通过一个DecryptStart程序运行经过加密的应用。DecryptStart程序如Listing 6所示。 【Listing 6：DecryptStart.java，启动被加密应用的程序】<br />
<br />
import java.io.*;<br />
import java.security.*;<br />
import java.lang.reflect.*;<br />
import javax.crypto.*;<br />
import javax.crypto.spec.*;<br />
<br />
public class DecryptStart extends ClassLoader<br />
{<br />
&nbsp; // 这些对象在构造函数中设置，<br />
&nbsp; // 以后loadClass()方法将利用它们解密类<br />
&nbsp; private SecretKey key;<br />
&nbsp; private Cipher cipher;<br />
<br />
&nbsp; // 构造函数：设置解密所需要的对象<br />
&nbsp; public DecryptStart( SecretKey key ) throws GeneralSecurityException,<br />
&nbsp; &nbsp; &nbsp; IOException {<br />
&nbsp; &nbsp; this.key = key;<br />
<br />
&nbsp; &nbsp; String algorithm = "DES";<br />
&nbsp; &nbsp; SecureRandom sr = new SecureRandom();<br />
&nbsp; &nbsp; System.err.println( "[DecryptStart: creating cipher]" );<br />
&nbsp; &nbsp; cipher = Cipher.getInstance( algorithm );<br />
&nbsp; &nbsp; cipher.init( Cipher.DECRYPT_MODE, key, sr );<br />
&nbsp; }<br />
<br />
&nbsp; // main过程：我们要在这里读入密匙，创建DecryptStart的<br />
&nbsp; // 实例，它就是我们的定制ClassLoader。<br />
&nbsp; // 设置好ClassLoader以后，我们用它装入应用实例，<br />
&nbsp; // 最后，我们通过Java Reflection API调用应用实例的main方法<br />
&nbsp; static public void main( String args[] ) throws Exception {<br />
&nbsp; &nbsp; String keyFilename = args[0];<br />
&nbsp; &nbsp; String appName = args[1];<br />
<br />
&nbsp; &nbsp;&nbsp; // 这些是传递给应用本身的参数<br />
&nbsp; &nbsp; String realArgs[] = new String[args.length-2];<br />
&nbsp; &nbsp; System.arraycopy( args, 2, realArgs, 0, args.length-2 );<br />
<br />
&nbsp; &nbsp; // 读取密匙<br />
&nbsp; &nbsp; System.err.println( "[DecryptStart: reading key]" );<br />
&nbsp; &nbsp; byte rawKey[] = Util.readFile( keyFilename );<br />
&nbsp; &nbsp; DESKeySpec dks = new DESKeySpec( rawKey );<br />
&nbsp; &nbsp; SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" );<br />
&nbsp; &nbsp; SecretKey key = keyFactory.generateSecret( dks );<br />
<br />
&nbsp; &nbsp; // 创建解密的ClassLoader<br />
&nbsp; &nbsp; DecryptStart dr = new DecryptStart( key );<br />
<br />
&nbsp; &nbsp; // 创建应用主类的一个实例<br />
&nbsp; &nbsp; // 通过ClassLoader装入它<br />
&nbsp; &nbsp; System.err.println( "[DecryptStart: loading "+appName+"]" );<br />
&nbsp; &nbsp; Class clasz = dr.loadClass( appName );<br />
<br />
&nbsp; &nbsp; // 最后，通过Reflection API调用应用实例<br />
&nbsp; &nbsp; // 的main()方法<br />
<br />
&nbsp; &nbsp; // 获取一个对main()的引用<br />
&nbsp; &nbsp; String proto[] = new String[1];<br />
&nbsp; &nbsp; Class mainArgs[] = { (new String[1]).getClass() };<br />
&nbsp; &nbsp; Method main = clasz.getMethod( "main", mainArgs );<br />
<br />
&nbsp; &nbsp; // 创建一个包含main()方法参数的数组<br />
&nbsp; &nbsp; Object argsArray[] = { realArgs };<br />
&nbsp; &nbsp; System.err.println( "[DecryptStart: running "+appName+".main()]" );<br />
<br />
&nbsp; &nbsp; // 调用main()<br />
&nbsp; &nbsp; main.invoke( null, argsArray );<br />
&nbsp; }<br />
<br />
&nbsp; public Class loadClass( String name, boolean resolve )<br />
&nbsp; &nbsp; &nbsp; throws ClassNotFoundException {<br />
&nbsp; &nbsp; try {<br />
&nbsp; &nbsp; &nbsp; // 我们要创建的Class对象<br />
&nbsp; &nbsp; &nbsp; Class clasz = null;<br />
<br />
&nbsp; &nbsp; &nbsp; // 必需的步骤1：如果类已经在系统缓冲之中<br />
&nbsp; &nbsp; &nbsp; // 我们不必再次装入它<br />
&nbsp; &nbsp; &nbsp; clasz = findLoadedClass( name );<br />
<br />
&nbsp; &nbsp; &nbsp; if (clasz != null)<br />
&nbsp; &nbsp; &nbsp; &nbsp; return clasz;<br />
<br />
&nbsp; &nbsp; &nbsp; // 下面是定制部分<br />
&nbsp; &nbsp; &nbsp; try {<br />
&nbsp; &nbsp; &nbsp; &nbsp; // 读取经过加密的类文件<br />
&nbsp; &nbsp; &nbsp; &nbsp; byte classData[] = Util.readFile( name+".class" );<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (classData != null) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 解密...<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; byte decryptedClassData[] = cipher.doFinal( classData );<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ... 再把它转换成一个类<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; clasz = defineClass( name, decryptedClassData,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, decryptedClassData.length );<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.err.println( "[DecryptStart: decrypting class "+name+"]" );<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; } catch( FileNotFoundException fnfe ) {<br />
&nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; // 必需的步骤2：如果上面没有成功<br />
&nbsp; &nbsp; &nbsp; // 我们尝试用默认的ClassLoader装入它<br />
&nbsp; &nbsp; &nbsp; if (clasz == null)<br />
&nbsp; &nbsp; &nbsp; &nbsp; clasz = findSystemClass( name );<br />
<br />
&nbsp; &nbsp; &nbsp; // 必需的步骤3：如有必要，则装入相关的类<br />
&nbsp; &nbsp; &nbsp; if (resolve &amp;&amp; clasz != null)<br />
&nbsp; &nbsp; &nbsp; &nbsp; resolveClass( clasz );<br />
<br />
&nbsp; &nbsp; &nbsp; // 把类返回给调用者<br />
&nbsp; &nbsp; &nbsp; return clasz;<br />
&nbsp; &nbsp; } catch( IOException ie ) {<br />
&nbsp; &nbsp; &nbsp; throw new ClassNotFoundException( ie.toString()<br />
);<br />
&nbsp; &nbsp; } catch( GeneralSecurityException gse ) {<br />
&nbsp; &nbsp; &nbsp; throw new ClassNotFoundException( gse.toString()<br />
);<br />
&nbsp; &nbsp; }<br />
&nbsp; }<br />
}<br />
<br />
<br />
对于未经加密的应用，正常执行方式如下： % java App arg0 arg1 arg2<br />
<br />
<br />
对于经过加密的应用，则相应的运行方式为： % java DecryptStart key.data App arg0 arg1 arg2<br />
<br />
<br />
<br />
DecryptStart
有两个目的。一个DecryptStart的实例就是一个实施即时解密操作的定制ClassLoader；同时，DecryptStart还包含一个
main过程，它创建解密器实例并用它装入和运行应用。示例应用App的代码包含在App.java、Foo.java和Bar.java内。
Util.java是一个文件I/O工具，本文示例多处用到了它。完整的代码请从本文最后下载。<br />
<br />
五、注意事项<br />
我们看到，要在不修改源代码的情况下加密一个Java应用是很容易的。不过，世上没有完全安全的系统。本文的加密方式提供了一定程度的源代码保护，但对某些攻击来说它是脆弱的。<br />
<br />
虽
然应用本身经过了加密，但启动程序DecryptStart没有加密。攻击者可以反编译启动程序并修改它，把解密后的类文件保存到磁盘。降低这种风险的办
法之一是对启动程序进行高质量的模糊处理。或者，启动程序也可以采用直接编译成机器语言的代码，使得启动程序具有传统执行文件格式的安全性。<br />
<br />
另外还要记住的是，大多数JVM本身并不安全。狡猾的黑客可能会修改JVM，从ClassLoader之外获取解密后的代码并保存到磁盘，从而绕过本文的加密技术。Java没有为此提供真正有效的补救措施。<br />
<br />
不过应该指出的是，所有这些可能的攻击都有一个前提，这就是攻击者可以得到密匙。如果没有密匙，应用的安全性就完全取决于加密算法的安全性。虽然这种保护代码的方法称不上十全十美，但它仍不失为一种保护知识产权和敏感用户数据的有效方案。<br />
<br />
参考资源<br />
<br />
在运行时刻更新功能模块。介绍了一个利用类库加载器ClassLoader 实现在运行时刻更新部分功能模块的Java程序，并将其与C/C++中实现同样功能的动态链接库方案进行了比较。 <br />
Java 技巧 105：利用 JWhich 掌握类路径。展示一个简单的工具，它可以清楚地确定类装载器从类路径中载入了什么 Java 类。 <br />
要了解更多的 Java 安全信息，请阅读 java.sun.com的 Java Security API 页。 <br />
如何封锁您的（或打开别人的） Java 代码。Java 代码反编译和模糊处理的指南。 <br />
使您的软件运行起来：摆弄数字。真正安全的软件需要精确的随机数生成器。 <br />
下载本文代码：EncryptedJavaClass_code.zip <br />
<br />
<br />
关于作者 <br />
俞良松，软件工程师，独立顾问和自由撰稿人。最初从事PB和Oracle开发，现主要兴趣在于Internet开发。您可以通过 javaman@163.net 和我联系。 <br />
<img src ="http://www.blogjava.net/cooperlee321/aggbug/317240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cooperlee321/" target="_blank">梧桐夜雨</a> 2010-04-01 22:52 <a href="http://www.blogjava.net/cooperlee321/archive/2010/04/01/317240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的多进程运行模式分析(转)</title><link>http://www.blogjava.net/cooperlee321/archive/2010/04/01/317236.html</link><dc:creator>梧桐夜雨</dc:creator><author>梧桐夜雨</author><pubDate>Thu, 01 Apr 2010 14:29:00 GMT</pubDate><guid>http://www.blogjava.net/cooperlee321/archive/2010/04/01/317236.html</guid><wfw:comment>http://www.blogjava.net/cooperlee321/comments/317236.html</wfw:comment><comments>http://www.blogjava.net/cooperlee321/archive/2010/04/01/317236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cooperlee321/comments/commentRss/317236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cooperlee321/services/trackbacks/317236.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/cooperlee321/archive/2010/04/01/317236.html'>阅读全文</a><img src ="http://www.blogjava.net/cooperlee321/aggbug/317236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cooperlee321/" target="_blank">梧桐夜雨</a> 2010-04-01 22:29 <a href="http://www.blogjava.net/cooperlee321/archive/2010/04/01/317236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JUnit 4 </title><link>http://www.blogjava.net/cooperlee321/archive/2010/01/03/308111.html</link><dc:creator>梧桐夜雨</dc:creator><author>梧桐夜雨</author><pubDate>Sun, 03 Jan 2010 14:25:00 GMT</pubDate><guid>http://www.blogjava.net/cooperlee321/archive/2010/01/03/308111.html</guid><wfw:comment>http://www.blogjava.net/cooperlee321/comments/308111.html</wfw:comment><comments>http://www.blogjava.net/cooperlee321/archive/2010/01/03/308111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cooperlee321/comments/commentRss/308111.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cooperlee321/services/trackbacks/308111.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;                                                                        &nbsp;                                                                                    级别： 中级        ...&nbsp;&nbsp;<a href='http://www.blogjava.net/cooperlee321/archive/2010/01/03/308111.html'>阅读全文</a><img src ="http://www.blogjava.net/cooperlee321/aggbug/308111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cooperlee321/" target="_blank">梧桐夜雨</a> 2010-01-03 22:25 <a href="http://www.blogjava.net/cooperlee321/archive/2010/01/03/308111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java代理模式及动态代理类</title><link>http://www.blogjava.net/cooperlee321/archive/2010/01/03/308109.html</link><dc:creator>梧桐夜雨</dc:creator><author>梧桐夜雨</author><pubDate>Sun, 03 Jan 2010 14:16:00 GMT</pubDate><guid>http://www.blogjava.net/cooperlee321/archive/2010/01/03/308109.html</guid><wfw:comment>http://www.blogjava.net/cooperlee321/comments/308109.html</wfw:comment><comments>http://www.blogjava.net/cooperlee321/archive/2010/01/03/308109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cooperlee321/comments/commentRss/308109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cooperlee321/services/trackbacks/308109.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Chuangyan%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
<link rel="themeData" href="file:///C:%5CDOCUME%7E1%5Chuangyan%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Chuangyan%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:DontVertAlignCellWithSp/>
<w:DontBreakConstrainedForcedTables/>
<w:DontVertAlignInTxbx/>
<w:Word11KerningPairs/>
<w:CachedColBalance/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math" />
<m:brkBin m:val="before" />
<m:brkBinSub m:val="&#45;-" />
<m:smallFrac m:val="off" />
<m:dispDef/>
<m:lMargin m:val="0" />
<m:rMargin m:val="0" />
<m:defJc m:val="centerGroup" />
<m:wrapIndent m:val="1440" />
<m:intLim m:val="subSup" />
<m:naryLim m:val="undOvr" />
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267">
<w:LsdException locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal" />
<w:LsdException locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 2" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 3" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 4" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 5" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 6" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 7" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 8" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 9" />
<w:LsdException locked="false" priority="39" name="toc 1" />
<w:LsdException locked="false" priority="39" name="toc 2" />
<w:LsdException locked="false" priority="39" name="toc 3" />
<w:LsdException locked="false" priority="39" name="toc 4" />
<w:LsdException locked="false" priority="39" name="toc 5" />
<w:LsdException locked="false" priority="39" name="toc 6" />
<w:LsdException locked="false" priority="39" name="toc 7" />
<w:LsdException locked="false" priority="39" name="toc 8" />
<w:LsdException locked="false" priority="39" name="toc 9" />
<w:LsdException locked="false" priority="35" qformat="true" name="caption" />
<w:LsdException locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title" />
<w:LsdException locked="false" priority="1" name="Default Paragraph Font" />
<w:LsdException locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle" />
<w:LsdException locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong" />
<w:LsdException locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis" />
<w:LsdException locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid" />
<w:LsdException locked="false" unhidewhenused="false" name="Placeholder Text" />
<w:LsdException locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1" />
<w:LsdException locked="false" unhidewhenused="false" name="Revision" />
<w:LsdException locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph" />
<w:LsdException locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote" />
<w:LsdException locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6" />
<w:LsdException locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis" />
<w:LsdException locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis" />
<w:LsdException locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference" />
<w:LsdException locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference" />
<w:LsdException locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title" />
<w:LsdException locked="false" priority="37" name="Bibliography" />
<w:LsdException locked="false" priority="39" qformat="true" name="TOC Heading" />
</w:LatentStyles>
</xml><![endif]--><style>
<!-- /* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:1;
mso-generic-font-family:roman;
mso-font-format:other;
mso-font-pitch:variable;
mso-font-signature:0 0 0 0 0 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1073750139 0 0 159 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}
a:link, span.MsoHyperlink
{mso-style-noshow:yes;
mso-style-priority:99;
color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-noshow:yes;
mso-style-priority:99;
color:purple;
mso-themecolor:followedhyperlink;
text-decoration:underline;
text-underline:single;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
</style>
<![endif]-->
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><strong><span lang="EN-US">1.</span></strong><span style="font-size: 7pt; font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体;">代理模式</span><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt;"><span style="font-family: 宋体;">代理模式的作用是：为其他对象提供一种代理以控制对这个对象的访问。在某些情况下，一个客户不想或者不能直接引用另一个对象，而代理对象可以在客户端和目标对象之间起到中介的作用。</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt;"><span style="font-family: 宋体;">代理模式一般涉及到的角色有：</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">抽象角色</span></strong><span style="font-family: 宋体;">：声明真实对象和代理对象的共同接口；</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">代理角色</span></strong><span style="font-family: 宋体;">：代理对象角色内部含有对真实对象的引用，从而可以操作真实对象，同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时，代理对象可以在执行真实对象操作时，附加其他的操作，相当于对真实对象进行封装。</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">真实角色</span></strong><span style="font-family: 宋体;">：代理角色所代表的真实对象，是我们最终要引用的对象。</span><span lang="EN-US">(</span><span style="font-family: 宋体;">参见文献</span><span lang="EN-US">1)</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">以下以《</span><span lang="EN-US">Java</span><span style="font-family: 宋体;">与模式》中的示例为例：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">抽象角色：</span></p>
<p class="MsoNormal"><span lang="EN-US">abstract public class Subject</span></p>
<p class="MsoNormal"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; abstract public void
request();</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">真实角色：实现了</span><span lang="EN-US">Subject</span><span style="font-family: 宋体;">的</span><span lang="EN-US">request()</span><span style="font-family: 宋体;">方法。</span></p>
<p class="MsoNormal"><span lang="EN-US">public class RealSubject extends Subject </span></p>
<p class="MsoNormal"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
RealSubject()</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
void request()</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("From real
subject.");</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">代理角色：</span></p>
<p class="MsoNormal"><span lang="EN-US">public class ProxySubject extends Subject </span></p>
<p class="MsoNormal"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; private RealSubject
realSubject;&nbsp; //</span><span style="font-family: 宋体;">以真实角色作为代理角色的属性</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
ProxySubject()</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
void request()&nbsp; //</span><span style="font-family: 宋体;">该方法封装了真实对象的</span><span lang="EN-US">request</span><span style="font-family: 宋体;">方法</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
preRequest();&nbsp; </span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( realSubject == null )</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; realSubject = new RealSubject();</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
realSubject.request();&nbsp; //</span><span style="font-family: 宋体;">此处执行真实对象的</span><span lang="EN-US">request</span><span style="font-family: 宋体;">方法</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
postRequest(); </span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; private void
preRequest()</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; {</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//something you want to do before requesting</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; private void
postRequest()</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; {</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//something you want to do after requesting</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">客户端调用：</span></p>
<p class="MsoNormal"><span lang="EN-US">Subject sub=new ProxySubject();</span></p>
<p class="MsoNormal"><span lang="EN-US">Sub.request();</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">由以上代码可以看出，客户实际需要调用的是</span><span lang="EN-US">RealSubject</span><span style="font-family: 宋体;">类的</span><span lang="EN-US">request()</span><span style="font-family: 宋体;">方法，现在用</span><span lang="EN-US">ProxySubject</span><span style="font-family: 宋体;">来代理</span><span lang="EN-US">RealSubject</span><span style="font-family: 宋体;">类，同样达到目的，同时还封装了其他方法</span><span lang="EN-US">(preRequest(),postRequest())</span><span style="font-family: 宋体;">，可以处理一些其他问题。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">另外，如果要按照上述的方法使用代理模式，那么真实角色必须是事先已经存在的，并将其作为代理对象的内部属性。但是实际使用时，一个真实角色必须对应一个代理角色，如果大量使用会导致类的急剧膨胀；此外，如果事先并不知道真实角色，该如何使用代理呢？这个问题可以通过</span><span lang="EN-US">Java</span><span style="font-family: 宋体;">的动态代理类来解决。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><strong><span lang="EN-US">2.</span></strong><strong><span style="font-family: 宋体;">动态代理类</span></strong></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java</span><span style="font-family: 宋体;">动态代理类位于</span><span lang="EN-US">Java.lang.reflect</span><span style="font-family: 宋体;">包下，一般主要涉及到以下两个类：</span></p>
<p class="MsoNormal"><span lang="EN-US">(1). Interface InvocationHandler</span><span style="font-family: 宋体;">：该接口中仅定义了一个方法</span><span lang="EN-US">Object</span><span style="font-family: 宋体;">：</span><span lang="EN-US">invoke(Object
obj,Method method, <span><span class="MsoHyperlink">Object</span></span>[]&nbsp;args)</span><span style="font-family: 宋体;">。在实际使用时，第一个参数</span><span lang="EN-US">obj</span><span style="font-family: 宋体;">一般是指代理类，</span><span lang="EN-US">method</span><span style="font-family: 宋体;">是被代理的方法，如上例中的</span><span lang="EN-US">request()</span><span style="font-family: 宋体;">，</span><span lang="EN-US">args</span><span style="font-family: 宋体;">为该方法的参数数组。这个抽象方法在代理类中动态实现。</span></p>
<p class="MsoNormal"><span lang="EN-US"><br />
(2).Proxy</span><span style="font-family: 宋体;">：该类即为动态代理类，作用类似于上例中的</span><span lang="EN-US">ProxySubject</span><span style="font-family: 宋体;">，其中主要包含以下内容：</span></p>
<p class="MsoNormal"><span lang="EN-US">Protected Proxy(InvocationHandler h)</span><span style="font-family: 宋体;">：构造函数，估计用于给内部的</span><span lang="EN-US">h</span><span style="font-family: 宋体;">赋值。</span></p>
<p class="MsoNormal"><span lang="EN-US">Static Class getProxyClass
(ClassLoader&nbsp;loader, Class[]&nbsp;interfaces)</span><span style="font-family: 宋体;">：获得一个代理类，其中</span><span lang="EN-US">loader</span><span style="font-family: 宋体;">是类装载器，</span><span lang="EN-US">interfaces</span><span style="font-family: 宋体;">是真实类所拥有的全部接口的数组。</span></p>
<p class="MsoNormal"><span lang="EN-US">Static Object <a href="#newProxyInstance%28java.lang.ClassLoader,%20java.lang.Class[],%20java.lang.reflect.InvocationHandler%29">newProxyInstance</a>(ClassLoader&nbsp;loader,
Class[]&nbsp;interfaces, InvocationHandler&nbsp;h)</span><span style="font-family: 宋体;">：返回代理类的一个实例，返回后的代理类可以当作被代理类使用</span><span lang="EN-US">(</span><span style="font-family: 宋体;">可使用被代理类的在</span><span lang="EN-US">Subject</span><span style="font-family: 宋体;">接口中声明过的方法</span><span lang="EN-US">)</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal"><span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">所谓</span><span lang="EN-US">Dynamic Proxy</span><span style="font-family: 宋体;">是这样一种</span><span lang="EN-US">class</span><span style="font-family: 宋体;">：它是在运行时生成的</span><span lang="EN-US">class</span><span style="font-family: 宋体;">，在生成它时你必须提供一组</span><span lang="EN-US">interface</span><span style="font-family: 宋体;">给它，然后该</span><span lang="EN-US">class</span><span style="font-family: 宋体;">就宣称它实现了这些</span><span lang="EN-US">
interface</span><span style="font-family: 宋体;">。你当然可以把该</span><span lang="EN-US">class</span><span style="font-family: 宋体;">的实例当作这些</span><span lang="EN-US">interface</span><span style="font-family: 宋体;">中的任何一个来用。当然啦，这个</span><span lang="EN-US">Dynamic Proxy</span><span style="font-family: 宋体;">其实就是一个</span><span lang="EN-US">Proxy</span><span style="font-family: 宋体;">，它不会替你作实质性的工作，在生成它的实例时你必须提供一个</span><span lang="EN-US">handler</span><span style="font-family: 宋体;">，由它接管实际的工作。</span><span lang="EN-US">(</span><span style="font-family: 宋体;">参见文献</span><span lang="EN-US">3)</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">在使用动态代理类时，我们必须实现</span><span lang="EN-US">InvocationHandler</span><span style="font-family: 宋体;">接口，以第一节中的示例为例：</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">抽象角色</span></strong><span lang="EN-US">(</span><span style="font-family: 宋体;">之前是抽象类，此处应改为接口</span><span lang="EN-US">)</span><span style="font-family: 宋体;">：</span></p>
<p class="MsoNormal"><span lang="EN-US">public interface Subject</span></p>
<p class="MsoNormal"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; abstract public void
request();</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">具体角色</span></strong><span lang="EN-US">RealSubject</span><span style="font-family: 宋体;">：同上；</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">代理角色：</span><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal"><span lang="EN-US">import java.lang.reflect.Method;</span></p>
<p class="MsoNormal"><span lang="EN-US">import java.lang.reflect.InvocationHandler;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">public class DynamicSubject implements
InvocationHandler {</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp; private Object sub;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp; public DynamicSubject() {</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp; }</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp; public DynamicSubject(Object obj) {</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; sub = obj;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp; }</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp; public Object invoke(Object proxy,
Method method, Object[] args) throws Throwable {</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;
System.out.println("before calling " + method);</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; method.invoke(sub,args);</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;
System.out.println("after calling " + method);</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; return null;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp; }</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">该代理类的内部属性为</span><span lang="EN-US">Object</span><span style="font-family: 宋体;">类，实际使用时通过该类的构造函数</span><span lang="EN-US">DynamicSubject(Object obj)</span><span style="font-family: 宋体;">对其赋值；此外，在该类还实现了</span><span lang="EN-US">invoke</span><span style="font-family: 宋体;">方法，该方法中的</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">method.invoke(sub,args);</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">其实就是调用被代理对象的将要被执行的方法，方法参数</span><span lang="EN-US">sub</span><span style="font-family: 宋体;">是实际的被代理对象，</span><span lang="EN-US">args</span><span style="font-family: 宋体;">为执行被代理对象相应操作所需的参数。通过动态代理类，我们可以在调用之前或之后执行一些相关操作。</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">客户端</span></strong><span style="font-family: 宋体;">：</span></p>
<p class="MsoNormal"><span lang="EN-US">import java.lang.reflect.InvocationHandler;</span></p>
<p class="MsoNormal"><span lang="EN-US">import java.lang.reflect.Proxy;</span></p>
<p class="MsoNormal"><span lang="EN-US">import java.lang.reflect.Constructor;</span></p>
<p class="MsoNormal"><span lang="EN-US">import java.lang.reflect.Method;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">public class Client</span></p>
<p class="MsoNormal"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; static public void
main(String[] args) throws Throwable</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RealSubject
rs = new RealSubject();&nbsp; //</span><span style="font-family: 宋体;">在这里指定被代理类</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
InvocationHandler ds = new DynamicSubject(rs);&nbsp; //</span><span style="font-family: 宋体;">初始化代理类</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;
Class cls = rs.getClass();</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="font-family: 宋体;">以下是分解步骤</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Class c =
Proxy.getProxyClass(cls.getClassLoader(),cls.getInterfaces()) ;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Constructor
ct=c.getConstructor(new Class[]{InvocationHandler.class});</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Subject
subject =(Subject) ct.newInstance(new Object[]{ds});</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="font-family: 宋体;">以下是一次性生成</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subject
subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
cls.getInterfaces(),ds );</span></p>
<p class="MsoNormal"><span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subject.request();</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">通过这种方式，被代理的对象</span><span lang="EN-US">(RealSubject)</span><span style="font-family: 宋体;">可以在运行时动态改变，需要控制的接口</span><span lang="EN-US">(Subject</span><span style="font-family: 宋体;">接口</span><span lang="EN-US">)</span><span style="font-family: 宋体;">可以在运行时改变，控制的方式</span><span lang="EN-US">(DynamicSubject</span><span style="font-family: 宋体;">类</span><span lang="EN-US">)</span><span style="font-family: 宋体;">也可以动态改变，从而实现了非常灵活的动态代理关系</span><span lang="EN-US">(</span><span style="font-family: 宋体;">参见文献</span><span lang="EN-US">2)</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">参考文献：</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><span lang="EN-US">1.</span><span style="font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">阎宏，《</span><span lang="EN-US">Java </span><span style="font-family: 宋体;">与模式》</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><span lang="EN-US">2.</span><span style="font-size: 7pt; font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">透明</span><span style="font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">《动态代理的前世今生》</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><span lang="EN-US">3.&nbsp;&nbsp; Forest Hou</span><span style="font-family: 宋体;">，《</span><span style="font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;" lang="EN-US">Dynamic Proxy </span><span style="font-family: 宋体;">在</span><span style="font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;" lang="EN-US"> Java RMI </span><span style="font-family: 宋体;">中的应用》</span></p>
<img src ="http://www.blogjava.net/cooperlee321/aggbug/308109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cooperlee321/" target="_blank">梧桐夜雨</a> 2010-01-03 22:16 <a href="http://www.blogjava.net/cooperlee321/archive/2010/01/03/308109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java泛型</title><link>http://www.blogjava.net/cooperlee321/archive/2010/01/03/308108.html</link><dc:creator>梧桐夜雨</dc:creator><author>梧桐夜雨</author><pubDate>Sun, 03 Jan 2010 14:10:00 GMT</pubDate><guid>http://www.blogjava.net/cooperlee321/archive/2010/01/03/308108.html</guid><wfw:comment>http://www.blogjava.net/cooperlee321/comments/308108.html</wfw:comment><comments>http://www.blogjava.net/cooperlee321/archive/2010/01/03/308108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cooperlee321/comments/commentRss/308108.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cooperlee321/services/trackbacks/308108.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Chuangyan%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
<link rel="themeData" href="file:///C:%5CDOCUME%7E1%5Chuangyan%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Chuangyan%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:DontVertAlignCellWithSp/>
<w:DontBreakConstrainedForcedTables/>
<w:DontVertAlignInTxbx/>
<w:Word11KerningPairs/>
<w:CachedColBalance/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math" />
<m:brkBin m:val="before" />
<m:brkBinSub m:val="&#45;-" />
<m:smallFrac m:val="off" />
<m:dispDef/>
<m:lMargin m:val="0" />
<m:rMargin m:val="0" />
<m:defJc m:val="centerGroup" />
<m:wrapIndent m:val="1440" />
<m:intLim m:val="subSup" />
<m:naryLim m:val="undOvr" />
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267">
<w:LsdException locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal" />
<w:LsdException locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 2" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 3" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 4" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 5" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 6" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 7" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 8" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 9" />
<w:LsdException locked="false" priority="39" name="toc 1" />
<w:LsdException locked="false" priority="39" name="toc 2" />
<w:LsdException locked="false" priority="39" name="toc 3" />
<w:LsdException locked="false" priority="39" name="toc 4" />
<w:LsdException locked="false" priority="39" name="toc 5" />
<w:LsdException locked="false" priority="39" name="toc 6" />
<w:LsdException locked="false" priority="39" name="toc 7" />
<w:LsdException locked="false" priority="39" name="toc 8" />
<w:LsdException locked="false" priority="39" name="toc 9" />
<w:LsdException locked="false" priority="35" qformat="true" name="caption" />
<w:LsdException locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title" />
<w:LsdException locked="false" priority="1" name="Default Paragraph Font" />
<w:LsdException locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle" />
<w:LsdException locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong" />
<w:LsdException locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis" />
<w:LsdException locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid" />
<w:LsdException locked="false" unhidewhenused="false" name="Placeholder Text" />
<w:LsdException locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1" />
<w:LsdException locked="false" unhidewhenused="false" name="Revision" />
<w:LsdException locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph" />
<w:LsdException locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote" />
<w:LsdException locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6" />
<w:LsdException locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis" />
<w:LsdException locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis" />
<w:LsdException locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference" />
<w:LsdException locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference" />
<w:LsdException locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title" />
<w:LsdException locked="false" priority="37" name="Bibliography" />
<w:LsdException locked="false" priority="39" qformat="true" name="TOC Heading" />
</w:LatentStyles>
</xml><![endif]--><style>
<!-- /* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:1;
mso-generic-font-family:roman;
mso-font-format:other;
mso-font-pitch:variable;
mso-font-signature:0 0 0 0 0 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1073750139 0 0 159 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
</style>
<![endif]-->
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">在<span lang="EN-US">Java SE1.5</span>中， 增加了一个新的特性：泛型（日本语中的总称型）。何谓泛型呢？通俗的说，就是泛泛的指定对象所操作的类型，而不像常规方式一样使用某种固定的类型去指定。
泛型的本质就是将所操作的数据类型参数化，也就是说，该数据类型被指定为一个参数。这种参数类型可以使用在类、接口以及方法定义中。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left; text-indent: -24pt;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">一、</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">为什么使用泛型呢？</span></strong><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 27pt; text-align: left; text-indent: -3pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体;">在以往的<span lang="EN-US">J2SE</span>中，没有泛型的情况下，通常是使用<span lang="EN-US">Object</span>类型来进行多种类型数据的操作。这个时候操作最多的就是针对该<span lang="EN-US">Object</span>进行数据的强制转换，而这种转换是基于开发者对该数据类型明确的情况下进行的（比如将<span lang="EN-US">Object</span>型转换为<span lang="EN-US">String</span>型）。倘若类型不一致，编译器在编译过程中不会报错，但在运行时会出错。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 27pt; text-align: left; text-indent: -3pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体;">使用泛型的好处在于，它在编译的时候进行类型安全检查，并且在运行时所有的转换都是强制的，隐式的，大大提高了代码的重用率。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 27pt; text-align: left; text-indent: -3pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left; text-indent: -24pt;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">二、</span></strong><span style="font-size: 7pt; font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;" lang="EN-US">&nbsp;
</span><strong><span style="font-size: 12pt; font-family: 宋体;">泛型的简单例子：</span></strong><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">首先，我们来看看下面两个普通的<span lang="EN-US">class</span>定义<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">public class
getString {<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">private String myStr;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">public String getStr() {<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; return myStr;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">public void setStr(str) {<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; myStr = str;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">public class
getDouble {<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">private Double myDou;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">public Double getDou() {<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; return myDou;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">public void setDou(dou) {<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; myDou = dou;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-size: 12pt; font-family: 宋体;">这两个<span lang="EN-US">class</span>除了所操作的数据类型不一致，其他机能都是相同的。现在，我们可以使用泛型来将上面两个<span lang="EN-US">class</span>合并为一个，从而提高代码利用率，减少代码量。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: blue;">public class getObj&lt;T&gt; {</span><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: blue;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
private T myObj ;</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: blue;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: blue;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public T getObj() {</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: blue;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return myObj;</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: blue;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: blue;" lang="EN-US">&nbsp;</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: blue;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public void setObj&lt;T obj&gt; {</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: blue;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;myObj = obj;</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: blue;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: blue;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: blue;" lang="EN-US">&nbsp;</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-size: 12pt; font-family: 宋体;">那么，使用了泛型后，如何生成这个<span lang="EN-US">class</span>的实例来进行操作呢？请看下面的代码：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
getObj&lt;String&gt; strObj = new getObj&lt;String&gt;();<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
strObj.setObj(</span><span style="font-size: 12pt; font-family: 宋体;">&#8220;<span lang="EN-US">Hello Nissay</span>&#8221;<span lang="EN-US">);<o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println(strObj.getObj());<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
getObj&lt;Double&gt; douObj = new getObj&lt;Double&gt;();<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
douObj.setObj(new Double(</span><span style="font-size: 12pt; font-family: 宋体;">&#8220;<span lang="EN-US">116023</span>&#8221;<span lang="EN-US">));<o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println(douObj.getObj());<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left; text-indent: -24pt;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">三、</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">例子分析</span></strong><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">现在我们来分析上面那段蓝色字体的代码：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">、<span lang="EN-US">&lt;T&gt;</span>是泛型的标记，当然可以使用别的名字，比如。使用<span lang="EN-US">&lt;T&gt;</span>声明一个泛型的引用，从而可以在<span lang="EN-US">class</span>、方法及接口中使用它进行数据定义，参数传递。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">、<span lang="EN-US">&lt;T&gt;</span>在声明的时候相当于一个有意义的数据类型，编译过程中不会发生错误；在实例化时，将其用一个具体的数据类型进行替代，从而就可以满足不用需求。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left; text-indent: -24pt;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">四、</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">泛型的规则和限制</span></strong><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">通过上述的例子，我们简单理解了泛型的含义。在使用泛型时，请注意其使用规则和限制，如下：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 63pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">、泛型的参数类型只能是类（<span lang="EN-US">class</span>）类型，而不能是简单类型。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size: 12pt; font-family: 宋体;">比如，<span lang="EN-US">&lt;int&gt;</span>是不可使用的。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 63pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">、可以声明多个泛型参数类型，比如<span lang="EN-US">&lt;T, P,Q</span>&#8230;<span lang="EN-US">&gt;</span>，同时还可以嵌套泛型，例如：<span lang="EN-US">&lt;List&lt;String&gt;&gt;<o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 63pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">3</span><span style="font-size: 12pt; font-family: 宋体;">、泛型的参数类型可以使用<span lang="EN-US">extends</span>语句，例如<span lang="EN-US">&lt;T extends superclass&gt;</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 63pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">4</span><span style="font-size: 12pt; font-family: 宋体;">、泛型的参数类型可以使用<span lang="EN-US">super</span>语句，例如<span lang="EN-US">&lt; T super childclass&gt;</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 63pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">5</span><span style="font-size: 12pt; font-family: 宋体;">、泛型还可以使用通配符，例如<span lang="EN-US">&lt;? extends
ArrayList&gt;<o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 45pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 48pt; text-align: left; text-indent: -24pt;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">五、</span></strong><span style="font-size: 7pt; font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;" lang="EN-US">
</span><strong><span style="font-size: 12pt; font-family: 宋体;">扩展</span></strong><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">、<span lang="EN-US">extends</span>语句<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">使用<span lang="EN-US">extends</span>语句将限制泛型参数的适用范围。例如：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&lt;T extends
collection&gt; </span><span style="font-size: 12pt; font-family: 宋体;">，则表示该泛型参数的使用范围是所有实现了<span lang="EN-US">collection</span>接口的<span lang="EN-US">calss</span>。如果传入一个<span lang="EN-US">&lt;String&gt;</span>则程序编译出错。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">、<span lang="EN-US">super</span>语句<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">super</span><span style="font-size: 12pt; font-family: 宋体;">语句的作用与<span lang="EN-US">extends</span>一样，都是限制泛型参数的适用范围。区别在于，<span lang="EN-US">super</span>是限制泛型参数只能是指定该<span lang="EN-US">class</span>的上层父类。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">例如<span lang="EN-US">&lt;T super
List&gt;</span>，表示该泛型参数只能是<span lang="EN-US">List</span>和<span lang="EN-US">List</span>的上层父类。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">3</span><span style="font-size: 12pt; font-family: 宋体;">、通配符<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">使用通配符的目的是为了解决泛型参数被限制死了不能动态根据实例来确定的缺点。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">举个例子：<span lang="EN-US">public
class SampleClass &lt; T extends S&gt; {</span>&#8230;<span lang="EN-US">}<o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">假如<span lang="EN-US">A</span>，<span lang="EN-US">B</span>，<span lang="EN-US">C</span>，&#8230;<span lang="EN-US">Z</span>这<span lang="EN-US">26</span>个<span lang="EN-US">class</span>都实现了<span lang="EN-US">S</span>接口。我们使用时需要使用到这<span lang="EN-US">26</span>个<span lang="EN-US">class</span>类型的泛型参数。那实例化的时候怎么办呢？依次写下<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">SampleClass&lt;A&gt;
a = new SampleClass();<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">SampleClass&lt;B&gt;
a = new SampleClass();<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&#8230;<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">SampleClass&lt;Z&gt;
a = new SampleClass(); <o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">这显然很冗余，还不如使用<span lang="EN-US">Object</span>而不使用泛型，呵呵，是吧？<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">别着急，咱们使用通配符，就<span lang="EN-US">OK</span>了。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 66pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">SampleClass&lt;?
Extends S&gt; sc = new SampleClass();<o:p></o:p></span></p>
<img src ="http://www.blogjava.net/cooperlee321/aggbug/308108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cooperlee321/" target="_blank">梧桐夜雨</a> 2010-01-03 22:10 <a href="http://www.blogjava.net/cooperlee321/archive/2010/01/03/308108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>