﻿<?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</title><link>http://www.blogjava.net/liuxiaosan/category/48194.html</link><description>操蛋的人生处处充满美妙</description><language>zh-cn</language><lastBuildDate>Tue, 13 Sep 2011 10:39:26 GMT</lastBuildDate><pubDate>Tue, 13 Sep 2011 10:39:26 GMT</pubDate><ttl>60</ttl><item><title>Java Annotation 注解</title><link>http://www.blogjava.net/liuxiaosan/articles/347691.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Mon, 22 Aug 2011 10:33:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/347691.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/347691.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/347691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/347691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/347691.html</trackback:ping><description><![CDATA[<h2>Annotation（注解）是什么？</h2>
附加在代码中的一些元信息，用于一些工具在编译、运行时进行解析和使用，起到说明、配置的功能。<br />注解不会也不能影响代码的实际逻辑，仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。<br />
<br /><h2>
1、Annotation的定义</h2>
首先看一下如何定义我们自己的注解，下面是SpringMvc中RequestParam注解的定义。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">@Retention(RetentionPolicy.RUNTIME) // <span style="color: #008000; ">注解的保留策略</span><br />
@Target(ElementType.PARAMETER)&nbsp; // <span style="color: #008000; ">注解的作用目标</span><br />
@Documented<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;@</span><span style="color: #0000FF; ">interface</span><span style="color: #000000; ">&nbsp;RequestParam&nbsp;{&nbsp; //<span style="color: #008000; "> 使用@interface定义注解</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">""</span><span style="color: #000000; ">;&nbsp; // <span style="color: #008000; ">类似方法的属性</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;required()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;&nbsp; // <span style="color: #008000; ">使用default指定属性的默认值</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;defaultValue()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;ValueConstants.DEFAULT_NONE;<br />
}</span></div>
<br />
使用方式如下：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;deleteUser(@RequestParam(value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">id</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,required</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">)&nbsp;Long&nbsp;id)&nbsp;&nbsp;{&nbsp;}</span></div>
<br /><h2>2、元注解</h2>元注解是指注解的注解。包括&nbsp; @Retention @Target @Document @Inherited四种。<br /><h4>
2.1、@Retention: 定义注解的保留策略</h4>
<div>@Retention(RetentionPolicy.<span style="color: #000000; ">SOURCE</span>)&nbsp;&nbsp; <span style="color: #008000; ">注解仅存在于源码中，在class字节码文件中不包含</span></div>
<div>@Retention(RetentionPolicy.<span style="color: #000000; ">CLASS</span>)<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认的保留策略，</span><span style="color: #008000; ">注解会在class字节码文件中存在，但运行时无法获得，</span></div>
<div>@Retention(RetentionPolicy.RUNTIME)&nbsp;&nbsp; <span style="color: #008000;">注解会在class字节码文件中存在，在运行时可以通过反射获取到</span><br /><h4>
2.2、@Target：定义注解的作用目标</h4>
<div>@Target(ElementType.TYPE)&nbsp;&nbsp;   <span style="color: #008000;">接口、类、枚举、注解</span></div>
<div>@Target(ElementType.FIELD)&nbsp; <span style="color: #008000;">字段、枚举的常量</span></div>
<div>@Target(ElementType.METHOD)&nbsp; <span style="color: #008000;">方法</span></div>
<div>@Target(ElementType.PARAMETER) <span style="color: #008000;">方法参数</span></div>
<div>@Target(ElementType.CONSTRUCTOR)&nbsp; <span style="color: #008000;">构造函数</span></div>
<div>@Target(ElementType.LOCAL_VARIABLE) <span style="color: #008000;">局部变量</span></div>
<div>@Target(ElementType.ANNOTATION_TYPE) <span style="color: #008000;">注解</span></div>
<div>@Target(ElementType.PACKAGE)&nbsp; <span style="color: #008000;">包</span>&nbsp;&nbsp;&nbsp; <br /><h4>2.3、@Document：说明该注解将被包含在javadoc中</h4><h4>2.4、@Inherited：说明子类可以继承父类中的该注解</h4><h2>3、通过反射读取注解</h2><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;java.lang.reflect;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.lang.annotation.Annotation;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">interface</span><span style="color: #000000; ">&nbsp;AnnotatedElement&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">判断该元素中某个注解类型是否存在</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;isAnnotationPresent(Class</span><span style="color: #000000; ">&lt;?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Annotation</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;annotationClass);<br /><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">获得该元素中某个注解类型的注解</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Annotation</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;T&nbsp;getAnnotation(Class</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;annotationClass);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">获得该元素中所有可见的注解，包含继承得到的注解</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;Annotation[]&nbsp;getAnnotations();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">获得该元素自身什么的注解，不包含继承得到的注解</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;Annotation[]&nbsp;getDeclaredAnnotations();<br />}<br /></span></div><br />java.lang.Package<br />java.lang.Class<br />java.lang.reflect.Construtor<br />java.lang.reflect.Field<br />java.lang.reflect.Method<br />均实现了该接口，所以我们可以通过反射获取到 Class、Construtor、Field、Mehtod等，然后再通过上述接口方法，获得作用在这些元素上的注解。<br />下面是RequestParam注解的使用，为便于演示，略作修改，见org.springframework.web.bind.annotation.support.HandlerMethodInvoker源码<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">Method&nbsp;handlerMethod&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*****</span><span style="color: #000000; ">;<br />Annotation[]&nbsp;paramAnns&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;handlerMethod.getParameterAnnotations();<br /><br />String&nbsp;paramName&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;required&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />String&nbsp;defaultValue&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /><br /></span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(Annotation&nbsp;paramAnn&nbsp;:&nbsp;paramAnns)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(RequestParam.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">.isInstance(paramAnn))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestParam&nbsp;requestParam&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(RequestParam)&nbsp;paramAnn;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paramName&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;requestParam.value();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;requestParam.required();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaultValue&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;parseDefaultValueAttribute(requestParam.defaultValue());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;annotationsFound</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;*******其他处理*******************&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">}<br /><br /></span></div><br /><h2>4、常见注解的说明及使用</h2>@Override :@Target(ElementType.METHOD)&nbsp;&nbsp; @Retention(RetentionPolicy.SOURCE)&nbsp; 说明方法是对父类方法的覆盖，用于编译器编译时进行检查<br />@Deprecated: @Documented&nbsp; @Retention(RetentionPolicy.RUNTIME)&nbsp;&nbsp; 用于建议不要使用某元素<br />@SuppressWarnings：@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE)&nbsp; <br />&nbsp;&nbsp;&nbsp; 说明对被批注的代码元 素内部的某些警告保持静默</div>
</div><img src ="http://www.blogjava.net/liuxiaosan/aggbug/347691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-08-22 18:33 <a href="http://www.blogjava.net/liuxiaosan/articles/347691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Volatile变量</title><link>http://www.blogjava.net/liuxiaosan/articles/347878.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Fri, 08 Apr 2011 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/347878.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/347878.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/347878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/347878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/347878.html</trackback:ping><description><![CDATA[&nbsp;<strong><span style="color: red;">http://www.ibm.com/developerworks/cn/java/j-jtp06197.html</span></strong>&nbsp; 一文笔记<br />
<br />
在java中，为了提高性能，线程一般把变量从内存中备份一个副本到寄存器。volatile 关键字意思是易失性，明确表示<br />
一个变量是会被多线程访问的，每个线程在每次读取都要从内存读取原始副本的值，而不是缓存在寄存器中的值。每次修改<br />
都是把值写回到内存中。<br />
<br />
Java语言包含两种内在的同步机制：同步块（或方法）和 volatile 变量。<br />
<br />
synchronized锁提供了两种主要特性：<em>互斥（mutual exclusion）</em> 和<em>可见性（visibility）</em>。互斥即一次只允许一个线程持有某个特定的锁，因此可使用该特性实现对共享数据的协调访问协议，这样，一次就只有一个线程能够使用该共享数据。可见性必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的。 否则，线程看到的共享变量可能是修改前的值或不一致的值，引发严重问题。
<br />
<br />
volatile能够实现上述可见性，因为线程每次都是读取原始版本的值，前一个线程的修改对后续线程来说是可见的。但volatile不能确保互斥。<br />
<br />
volatile适用的原则：<br />
<ul>
    <li>对变量的写操作不依赖于当前值。</li>
    <li>该变量没有包含在具有其他变量的不变式中。</li>
</ul>
所以volatile不能用作计数器，因为计数器的自增是一个读-增-写的过程，不是原子操作，在volatile不确保互斥的情况下，结果不准确。<br />
不变式的意思是一个需要不变的规律，如起始要小于等于结束。上述2点简单来说：即变量真正独立于其他变量和自己以前的值 ， 在这些<br />
情况下可以使用 <code>volatile</code> 代替 <code>synchronized</code> 来简化代码。<br />
<br />
volatile由于不阻塞线程，在性能一般比synchronized表现更好。<br />
<br />
适用volatile的几个场景：<br />
1、状态标志&nbsp; 比如标示服务启动或停止。<br />
2、独立观察&nbsp; 定期 &#8220;发布&#8221; 观察结果供程序内部使用，<br />
3、<a name="listing6">结合使用 volatile 和 synchronized 实现 &#8220;开销较低的读－写锁&#8221;</a><br />
<pre class="displaycode">@ThreadSafe<br />
public class CheesyCounter {<br />
private <strong>volatile</strong> int value;<br />
// 使用volatile实现可见性，开销低<br />
public int getValue() { return value; }<br />
// 使用synchronized实现互斥<br />
public <strong>synchronized</strong> int increment() {<br />
return value++;<br />
}<br />
}<br />
</pre>
<br />
<br />
<br />
<img src ="http://www.blogjava.net/liuxiaosan/aggbug/347878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-04-08 16:28 <a href="http://www.blogjava.net/liuxiaosan/articles/347878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java动态代理</title><link>http://www.blogjava.net/liuxiaosan/articles/347552.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Wed, 06 Apr 2011 02:58:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/347552.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/347552.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/347552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/347552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/347552.html</trackback:ping><description><![CDATA[java dynamic proxy<br />
<br />
核心java.lang.reflect.Proxy类<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;根据给定接口和ClassLoader获取Class对象</span><span style="color: #008000;"><br />
// 使用Class.forName动态加载Class<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Class</span><span style="color: #000000;">&lt;?&gt;</span><span style="color: #000000;">&nbsp;getProxyClass(ClassLoader&nbsp;loader, Class</span><span style="color: #000000;">&lt;?&gt;</span><span style="color: #000000;"><img src="http://www.blogjava.net/Images/dot.gif" alt="" />&nbsp;interfaces)；<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建代理对象</span><span style="color: #008000;"><br />
// 通过反射的Constructor创建代理对象<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Object&nbsp;newProxyInstance(ClassLoader&nbsp;loader, Class</span><span style="color: #000000;">&lt;?&gt;</span><span style="color: #000000;">[]&nbsp;interfaces, InvocationHandler&nbsp;h)；<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;判断是否是代理Class</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isProxyClass(Class</span><span style="color: #000000;">&lt;?&gt;</span><span style="color: #000000;">&nbsp;cl)；<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;获得代理对象的InvocationHandler</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;InvocationHandler&nbsp;getInvocationHandler(Object&nbsp;proxy)</span></div>
<br />
java.lang.reflect.InvocationHandler接口<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;反射调用代理类方法</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;invoke(Object&nbsp;proxy,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Throwable;</span></div>
<br />
org.springframework.aop.framework.JdkDynamicAopProxy<br />
springframeworkAOP特性实现的基础之一，通过动态代理实现<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;org.springframework.aop.framework;<br />
</span><span style="color: #008080;">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;JdkDynamicAopProxy&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;AopProxy,&nbsp;InvocationHandler,&nbsp;Serializable&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;">&nbsp;代理的配置信息&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;AdvisedSupport&nbsp;advised;<br />
</span><span style="color: #008080;">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;JdkDynamicAopProxy(AdvisedSupport&nbsp;config)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;AopConfigException&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.notNull(config,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">AdvisedSupport&nbsp;must&nbsp;not&nbsp;be&nbsp;null</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">&nbsp;10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(config.getAdvisors().length&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;config.getTargetSource()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;AdvisedSupport.EMPTY_TARGET_SOURCE)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;AopConfigException(</span><span style="color: #000000;">"</span><span style="color: #000000;">No&nbsp;advisors&nbsp;and&nbsp;no&nbsp;TargetSource&nbsp;specified</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">&nbsp;12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;config;<br />
</span><span style="color: #008080;">&nbsp;14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;15</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;16</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;getProxy()&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;getProxy(ClassUtils.getDefaultClassLoader());<br />
</span><span style="color: #008080;">&nbsp;19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;获取代理对象</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;getProxy(ClassLoader&nbsp;classLoader)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(logger.isDebugEnabled())&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">Creating&nbsp;JDK&nbsp;dynamic&nbsp;proxy:&nbsp;target&nbsp;source&nbsp;is&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised.getTargetSource());<br />
</span><span style="color: #008080;">&nbsp;25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class[]&nbsp;proxiedInterfaces&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AopProxyUtils.completeProxiedInterfaces(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised);<br />
</span><span style="color: #008080;">&nbsp;27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);<br />
</span><span style="color: #008080;">&nbsp;28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;使用了Proxy动态代理创建代理对象</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Proxy.newProxyInstance(classLoader,&nbsp;proxiedInterfaces,&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">&nbsp;30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;31</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;32</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;回调代理对象</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;invoke(Object&nbsp;proxy,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Throwable&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodInvocation&nbsp;invocation;<br />
</span><span style="color: #008080;">&nbsp;36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;oldProxy&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;setProxyContext&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;38</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TargetSource&nbsp;targetSource&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised.targetSource;<br />
</span><span style="color: #008080;">&nbsp;40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;targetClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;target&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;42</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.equalsDefined&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;AopUtils.isEqualsMethod(method))&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;The&nbsp;target&nbsp;does&nbsp;not&nbsp;implement&nbsp;the&nbsp;equals(Object)&nbsp;method&nbsp;itself.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;equals(args[</span><span style="color: #000000;">0</span><span style="color: #000000;">]);<br />
</span><span style="color: #008080;">&nbsp;47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.hashCodeDefined&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;AopUtils.isHashCodeMethod(method))&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;The&nbsp;target&nbsp;does&nbsp;not&nbsp;implement&nbsp;the&nbsp;hashCode()&nbsp;method&nbsp;itself.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;hashCode();<br />
</span><span style="color: #008080;">&nbsp;51</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;52</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised.opaque&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;method.getDeclaringClass().isInterface()&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;53</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.getDeclaringClass().isAssignableFrom(Advised.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">))&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;54</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Service&nbsp;invocations&nbsp;on&nbsp;ProxyConfig&nbsp;with&nbsp;the&nbsp;proxy&nbsp;config<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;55</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;AopUtils.invokeJoinpointUsingReflection(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised,&nbsp;method,&nbsp;args);<br />
</span><span style="color: #008080;">&nbsp;56</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;57</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;58</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;retVal;<br />
</span><span style="color: #008080;">&nbsp;59</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;60</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised.exposeProxy)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;61</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Make&nbsp;invocation&nbsp;available&nbsp;if&nbsp;necessary.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;62</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oldProxy&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AopContext.setCurrentProxy(proxy);<br />
</span><span style="color: #008080;">&nbsp;63</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setProxyContext&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;64</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;65</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;66</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;May&nbsp;be&nbsp;null.&nbsp;Get&nbsp;as&nbsp;late&nbsp;as&nbsp;possible&nbsp;to&nbsp;minimize&nbsp;the&nbsp;time&nbsp;we&nbsp;"own"&nbsp;the&nbsp;target,<br />
</span><span style="color: #008080;">&nbsp;67</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;in&nbsp;case&nbsp;it&nbsp;comes&nbsp;from&nbsp;a&nbsp;pool.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;68</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;targetSource.getTarget();<br />
</span><span style="color: #008080;">&nbsp;69</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(target&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;70</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;target.getClass();<br />
</span><span style="color: #008080;">&nbsp;71</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;72</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;73</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Get&nbsp;the&nbsp;interception&nbsp;chain&nbsp;for&nbsp;this&nbsp;method.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;74</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;chain&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised.getInterceptorsAndDynamicInterceptionAdvice(method,&nbsp;targetClass);<br />
</span><span style="color: #008080;">&nbsp;75</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;76</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(chain.isEmpty())&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;77</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果拦截链是空的，直接通过反射调用target对象的方法<br />
</span><span style="color: #008080;">&nbsp;78</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;method.invoke(target,&nbsp;args);</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;79</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AopUtils.invokeJoinpointUsingReflection(target,&nbsp;method,&nbsp;args);<br />
</span><span style="color: #008080;">&nbsp;80</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;81</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果拦截链不为空，包装一个反射方法调用<br />
</span><span style="color: #008080;">&nbsp;82</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;先调用织入的拦截器，最后仍然是反射调用target对象的方法</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;83</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invocation&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ReflectiveMethodInvocation(proxy,&nbsp;target,&nbsp;method,&nbsp;args,&nbsp;targetClass,&nbsp;chain);<br />
</span><span style="color: #008080;">&nbsp;84</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Proceed&nbsp;to&nbsp;the&nbsp;joinpoint&nbsp;through&nbsp;the&nbsp;interceptor&nbsp;chain.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;85</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;invocation.proceed();<br />
</span><span style="color: #008080;">&nbsp;86</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;87</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;88</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Massage&nbsp;return&nbsp;value&nbsp;if&nbsp;necessary.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;89</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(retVal&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;retVal&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;target&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;method.getReturnType().isInstance(proxy)&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;90</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">RawTargetAccess.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.isAssignableFrom(method.getDeclaringClass()))&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;91</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Special&nbsp;case:&nbsp;it&nbsp;returned&nbsp;"this"&nbsp;and&nbsp;the&nbsp;return&nbsp;type&nbsp;of&nbsp;the&nbsp;method<br />
</span><span style="color: #008080;">&nbsp;92</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;is&nbsp;type-compatible.&nbsp;Note&nbsp;that&nbsp;we&nbsp;can't&nbsp;help&nbsp;if&nbsp;the&nbsp;target&nbsp;sets<br />
</span><span style="color: #008080;">&nbsp;93</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;a&nbsp;reference&nbsp;to&nbsp;itself&nbsp;in&nbsp;another&nbsp;returned&nbsp;object.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;94</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;proxy;<br />
</span><span style="color: #008080;">&nbsp;95</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;96</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;retVal;<br />
</span><span style="color: #008080;">&nbsp;97</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;98</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;99</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(target&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">targetSource.isStatic())&nbsp;{<br />
</span><span style="color: #008080;">100</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Must&nbsp;have&nbsp;come&nbsp;from&nbsp;TargetSource.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">101</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetSource.releaseTarget(target);<br />
</span><span style="color: #008080;">102</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">103</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(setProxyContext)&nbsp;{<br />
</span><span style="color: #008080;">104</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Restore&nbsp;old&nbsp;proxy.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">105</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AopContext.setCurrentProxy(oldProxy);<br />
</span><span style="color: #008080;">106</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">107</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">108</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">109</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">110</span>&nbsp;</div>
<br />
<br />
<br />
<img src ="http://www.blogjava.net/liuxiaosan/aggbug/347552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-04-06 10:58 <a href="http://www.blogjava.net/liuxiaosan/articles/347552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 反射</title><link>http://www.blogjava.net/liuxiaosan/articles/347387.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Thu, 31 Mar 2011 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/347387.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/347387.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/347387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/347387.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/347387.html</trackback:ping><description><![CDATA[Java Reflection 是一种<strong>内省</strong>机制，帮助程序在<strong>运行时</strong>对自身及软件环境进行检查，并根据检查得到的程序结构，改变自身的部分行为。 <br />
<br />
核心类为 <strong>java.lang.Class</strong> 类，抽象了程序的元数据，每一个类的元数据就是一个Class对象实例。这个Class实例是一个静态实例，对应类的每一个实例都会关联这个静态实例。通过Class类可以查询该类的方法、字段、接口、构造器等一系列信息。详见下面。 <br />
<br />
对象回去自身对应的Class实例是通过继承自Object类的getClass()方法； <br />
对于基本类型，每一种也有一个名为class的静态实例，如int.class double.class boolean.class； <br />
对于数组类型，也有Object[].class,   注意 int[][].class==int[].class <br />
<br />
<br />
判断对象类型的接口： <br />
String getName() 获得类全名 <br />
Class getComponentType() 如果对象是数组，返回数据中元素的类类型 <br />
boolean isArray() <br />
boolean isInterface() <br />
boolean isPrimitive() <br />
boolean isAnnotation() <br />
<br />
########################################################################################################### <br />
接口 <br />
java.lang.Class中定义的检查接口的接口： <br />
Class[] getInterfaces() <br />
Class getSuperClass() 直系父类 ，对于Object、接口、void关键字、基本类型，返回null <br />
boolean isAssignableFrom(Class cls) 该类是参数的类型或参数的父类型 <br />
boolean isInstance(Object obj) 该类是参数的实例或者参数的子类实例 <br />
<br />
Class类和Object类存在比较纠结的关系 <br />
Class.class.isIntance(Class.class) == true    Class类的class实例是Class本身的实例 <br />
Class.class.isInstance(Object.class) == true   <br />
Object.class.isAssignableFrom(Class.class) == true <br />
Object.class.isIntance(Class.class) == true <br />
<br />
########################################################################################################### <br />
java.lang.reflect部分类图 <br />
<br />
<a href="http://liucs.blog.chinajavaworld.com/servlet/AttachmentServlet/download/289475-51576-5108/reflect.JPG" target="_blank"><img style="cursor: pointer;" alt="" title="在新窗口打开图片" src="http://liucs.blog.chinajavaworld.com/servlet/AttachmentServlet/download/289475-51576-5108/reflect.JPG" border="0" /></a> <br />
########################################################################################################### <br />
<br />
java.lang.reflect.Constructor <br />
java.lang.Class中相关方法 <br />
<br />
Constructor getConstructor(Class[] parameterTypes) <br />
Constructor getDeclaredConstructor（Class[]parameterTypes) <br />
Constructor[] getConstructors() <br />
Constructor[] getDeclaredConstructors() <br />
<br />
java.lang.reflect.Constructor <br />
Class getDeclaredClass() <br />
Class[] getExceptionTypes() <br />
int getModifiers() <br />
String getName() <br />
Class[] getParameterTypes() <br />
Object newInstance(Object[] initArgs)  创建实例 <br />
<br />
对于数组，使用 java.lang.reflect.Array.newInstance(String.class,5)形式创建实例 <br />
<br />
########################################################################################################### <br />
<br />
java.lang.reflect.Method <br />
<br />
java.lang.Class类中定义了如下接口查询一个类所具有的方法。 <br />
Method getMethod(String name,Class[]parameterTypes) <br />
Method[] getMethods() <br />
上述2个接口查询继承获得和自身声明的方法 <br />
Method getDeclaredMethod(String name,Class[]parameterTypes)  <br />
Method[] getDeclaredMethods() <br />
上述2个接口查询自身声明的方法 <br />
<br />
java.lang.reflect.Method类定义的方法  <br />
Class getDeclaringClass()  声明该方法的类实例 <br />
Class[] getExceptionTypes()  方法的异常类型 <br />
int getModifiers() 方法的可见性 <br />
String getName() 方法名 <br />
Class[] getParameterTypes() 方法参数类型 <br />
Class getReturnType() 方法返回类型 <br />
Object invoke(Object obj,Object[]args) 反射调用一个对象上面的该方法 <br />
<br />
########################################################################################################### <br />
<br />
java.lang.reflect.Field <br />
<br />
java.lang.Class类中关于Field的相关方法： <br />
Field getField(String name) <br />
Field[]  getFields() <br />
Field getDeclaredField(String name) <br />
Field[] getDeclaredFields() <br />
<br />
java.lang.relect.Field中主要方法 <br />
Class  getType() 返回字段的Class <br />
Class getDeclaringClass()  返回什么该字段的Class <br />
String getName() <br />
int getModifiers() <br />
Object get(Object obj) 返回obj该字段的值 <br />
boolean getBoolean(Object obj) <br />
void set(Object obj,Object value) 设置obj该字段的值 <br />
void setBoolean(Object obj,boolean value) <br />
<br />
########################################################################################################### <br />
<br />
java.lang.reflect.Modifier 字段或者方法的访问性 <br />
static boolean isPublic(int mod) <br />
static boolean isPrivate(int mod) <br />
<br />
共包括以下：  <br />
public static native volatile protected transient  <br />
abstract synchronized strictfp  private final <br />
<br />
<br />
###########################################################################################################<br />
动态加载<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Class&nbsp;cls&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Class.forName(String&nbsp;className);<br />
Object&nbsp;obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cls.newInstance();</span></div>
<br />
动态加载机制使得可以避开编译器类范围的限制，常见场景是jdbc驱动。动态加载机制也是通过ClassLoader实现。<br />
通过动态加载机制的类名并不是一般意义的类名，而是：<br />
1、基本类型，首字母大写，如 int -&gt; I<br />
2、引用类型，L+全类名，如 Ljava.lang.String<br />
3、数组类型，[+***， 如[I, &nbsp; [Ljava.lang.String&nbsp; ,&nbsp; [[I,&nbsp; [[Ljava.lang.String<br />
<br />
注意：基本类型，不能通过Class.forName（）加载,会抛出异常<br />
<img src ="http://www.blogjava.net/liuxiaosan/aggbug/347387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-03-31 14:06 <a href="http://www.blogjava.net/liuxiaosan/articles/347387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 参数传递</title><link>http://www.blogjava.net/liuxiaosan/articles/347384.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Thu, 31 Mar 2011 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/347384.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/347384.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/347384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/347384.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/347384.html</trackback:ping><description><![CDATA[Java在方法参数传递时：<br />
<br />
1、对于基本类型，传递值<br />
2、对于对象类型，传递对象引用<br />
需要注意的是：对于上述两种传递类型，在传递时都是拷贝传递，即值传递时拷贝出一个新值，引用<br />
传递时拷贝出一个新的拷贝。<br />
<br />
有时候也说Java只有值传递，意思是对于引用类型，传递引用的值。一个概念，不用纠缠。<br />
<br />
在内存中对象类型可以看做两块，一块是对象的引用，一块是数据区。引用块里面保存了数据区的地址。<br />
看如下示例代码：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Test&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;值传递</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addInt1(i);<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(i);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;输出1</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addInt2(i);<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(i);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;输出1<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;引用传递实例1</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">123</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modifyStr1(str);<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;输出123<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #008000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;引用传递实例2</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;stringBuilder&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringBuilder(</span><span style="color: #000000;">"</span><span style="color: #000000;">123</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modifyStringBuilder(stringBuilder);<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(stringBuilder.toString());</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;输出123456</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;拷贝了新的值，原值不变</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addInt1(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;拷贝了新的值，原值不变</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addInt2(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;新的拷贝引用指向了一块新数据区，原拷贝仍然指向原数据区</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;modifyStr1(String&nbsp;str)&nbsp;{<br />
</span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">456</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;新的拷贝引用仍然指向原数据区，但修改了原数据区的内容</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;modifyStringBuilder(StringBuilder&nbsp;str)&nbsp;{<br />
</span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.append(</span><span style="color: #000000;">"</span><span style="color: #000000;">456</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
<img src ="http://www.blogjava.net/liuxiaosan/aggbug/347384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-03-31 14:05 <a href="http://www.blogjava.net/liuxiaosan/articles/347384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>