﻿<?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/zhhp1314520/category/16140.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 13 Nov 2007 21:36:53 GMT</lastBuildDate><pubDate>Tue, 13 Nov 2007 21:36:53 GMT</pubDate><ttl>60</ttl><item><title>Java反射经典实例 Java Reflection Cookbook (初级)</title><link>http://www.blogjava.net/zhhp1314520/articles/java_reflection_1.html</link><dc:creator>捕风</dc:creator><author>捕风</author><pubDate>Mon, 12 Nov 2007 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/zhhp1314520/articles/java_reflection_1.html</guid><wfw:comment>http://www.blogjava.net/zhhp1314520/comments/159963.html</wfw:comment><comments>http://www.blogjava.net/zhhp1314520/articles/java_reflection_1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhhp1314520/comments/commentRss/159963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhhp1314520/services/trackbacks/159963.html</trackback:ping><description><![CDATA[Java提供了一套机制来动态执行方法和构造方法，以及数组操作等，这套机制就叫——反射。反射机制是如今很多流行框架的实现基础，其中包括Spring、Hibernate等。原理性的问题不是本文的重点，接下来让我们在实例中学习这套精彩的机制。<br />
<br />
1. 得到某个对象的属性<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;getProperty(Object&nbsp;owner,&nbsp;String&nbsp;fieldName)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;ownerClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;owner.getClass();<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;field&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ownerClass.getField(fieldName);<br />
</span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;property&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;field.get(owner);<br />
</span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;property;<br />
</span><span style="color: #008080;">9</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
Class ownerClass = owner.getClass()：得到该对象的Class。<br />
<br />
Field field = ownerClass.getField(fieldName)：通过Class得到类声明的属性。<br />
<br />
Object property = field.get(owner)：通过对象得到该属性的实例，如果这个属性是非公有的，这里会报IllegalAccessException。<br />
<br />
<br />
<br />
2. 得到某个类的静态属性<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; 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;Object&nbsp;getStaticProperty(String&nbsp;className,&nbsp;String&nbsp;fieldName)<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;ownerClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Class.forName(className);<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;field&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ownerClass.getField(fieldName);<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;property&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;field.get(ownerClass);<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;property;<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
<br />
Class ownerClass = Class.forName(className) ：首先得到这个类的Class。<br />
<br />
Field field = ownerClass.getField(fieldName)：和上面一样，通过Class得到类声明的属性。<br />
<br />
Object property = field.get(ownerClass) ：这里和上面有些不同，因为该属性是静态的，所以直接从类的Class里取。<br />
<br />
<br />
3. 执行某对象的方法<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; 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;Object&nbsp;invokeMethod(Object&nbsp;owner,&nbsp;String&nbsp;methodName,&nbsp;Object[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&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;Class&nbsp;ownerClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;owner.getClass();<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Class[]&nbsp;argsClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Class[args.length];<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&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;">0</span><span style="color: #000000;">,&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args.length;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;j;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argsClass[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args[i].getClass();<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ownerClass.getMethod(methodName,&nbsp;argsClass);<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;method.invoke(owner,&nbsp;args);<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
Class owner_class = owner.getClass() ：首先还是必须得到这个对象的Class。<br />
<br />
5～9行：配置参数的Class数组，作为寻找Method的条件。<br />
<br />
Method method = ownerClass.getMethod(methodName, argsClass)：通过Method名和参数的Class数组得到要执行的Method。<br />
<br />
method.invoke(owner, args)：执行该Method，invoke方法的参数是执行这个方法的对象，和参数数组。返回值是Object，也既是该方法的返回值。<br />
<br />
<br />
4. 执行某个类的静态方法<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; 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;Object&nbsp;invokeStaticMethod(String&nbsp;className,&nbsp;String&nbsp;methodName,<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;ownerClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Class.forName(className);<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Class[]&nbsp;argsClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Class[args.length];<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&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;">0</span><span style="color: #000000;">,&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args.length;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;j;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argsClass[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args[i].getClass();<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ownerClass.getMethod(methodName,&nbsp;argsClass);<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;method.invoke(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,&nbsp;args);<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
<br />
基本的原理和实例3相同，不同点是最后一行，invoke的一个参数是null，因为这是静态方法，不需要借助实例运行。<br />
<br />
<br />
<br />
5. 新建实例<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; 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: #000000;"><br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;newInstance(String&nbsp;className,&nbsp;Object[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;newoneClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Class.forName(className);<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Class[]&nbsp;argsClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Class[args.length];<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&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;">0</span><span style="color: #000000;">,&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args.length;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;j;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argsClass[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args[i].getClass();<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;cons&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;newoneClass.getConstructor(argsClass);<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cons.newInstance(args);<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
<br />
这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数，可以直接使用newoneClass.newInstance()来实现。<br />
<br />
Class newoneClass = Class.forName(className)：第一步，得到要构造的实例的Class。<br />
<br />
第5～第9行：得到参数的Class数组。<br />
<br />
Constructor cons = newoneClass.getConstructor(argsClass)：得到构造子。<br />
<br />
cons.newInstance(args)：新建实例。<br />
<br />
<br />
6. 判断是否为某个类的实例<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isInstance(Object&nbsp;obj,&nbsp;Class&nbsp;cls)&nbsp;{<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cls.isInstance(obj);<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
<br />
<br />
7. 得到数组中的某个元素<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;getByArray(Object&nbsp;array,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;index)&nbsp;{<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Array.get(array,index);<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
<br />
<br />
附完整源码：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.lang.reflect.Array;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.lang.reflect.Constructor;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.lang.reflect.Field;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.lang.reflect.Method;<br />
<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;Java&nbsp;Reflection&nbsp;Cookbook<br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;Michael&nbsp;Lee<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@since</span><span style="color: #008000;">&nbsp;2006-8-23<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@version</span><span style="color: #008000;">&nbsp;0.1a<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Reflection&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;得到某个对象的公共属性<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;owner,&nbsp;fieldName<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;该属性对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;getProperty(Object&nbsp;owner,&nbsp;String&nbsp;fieldName)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;ownerClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;owner.getClass();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;field&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ownerClass.getField(fieldName);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;property&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;field.get(owner);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;property;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;得到某类的静态公共属性<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;className&nbsp;&nbsp;&nbsp;类名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;fieldName&nbsp;&nbsp;&nbsp;属性名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;该属性对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;getStaticProperty(String&nbsp;className,&nbsp;String&nbsp;fieldName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;ownerClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Class.forName(className);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;field&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ownerClass.getField(fieldName);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;property&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;field.get(ownerClass);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;property;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;执行某对象方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;owner<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;methodName<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;方法返回值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;invokeMethod(Object&nbsp;owner,&nbsp;String&nbsp;methodName,&nbsp;Object[]&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;ownerClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;owner.getClass();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class[]&nbsp;argsClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Class[args.length];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&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;">0</span><span style="color: #000000;">,&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args.length;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;j;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argsClass[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args[i].getClass();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ownerClass.getMethod(methodName,&nbsp;argsClass);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;method.invoke(owner,&nbsp;args);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;执行某类的静态方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;className<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;methodName<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参数数组<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;执行方法返回的结果<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;invokeStaticMethod(String&nbsp;className,&nbsp;String&nbsp;methodName,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;ownerClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Class.forName(className);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class[]&nbsp;argsClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Class[args.length];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&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;">0</span><span style="color: #000000;">,&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args.length;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;j;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argsClass[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args[i].getClass();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ownerClass.getMethod(methodName,&nbsp;argsClass);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;method.invoke(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,&nbsp;args);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;新建实例<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;className<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;构造函数的参数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;新建的实例<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;newInstance(String&nbsp;className,&nbsp;Object[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;newoneClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Class.forName(className);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class[]&nbsp;argsClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Class[args.length];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&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;">0</span><span style="color: #000000;">,&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args.length;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;j;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argsClass[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;args[i].getClass();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;cons&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;newoneClass.getConstructor(argsClass);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cons.newInstance(args);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;是不是某个类的实例<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;obj&nbsp;实例<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;cls&nbsp;类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;如果&nbsp;obj&nbsp;是此类的实例，则返回&nbsp;true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isInstance(Object&nbsp;obj,&nbsp;Class&nbsp;cls)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cls.isInstance(obj);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;得到数组中的某个元素<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;array&nbsp;数组<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;index&nbsp;索引<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;返回指定数组对象中索引组件的值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;getByArray(Object&nbsp;array,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;index)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Array.get(array,index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<img src ="http://www.blogjava.net/zhhp1314520/aggbug/159963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhhp1314520/" target="_blank">捕风</a> 2007-11-12 14:24 <a href="http://www.blogjava.net/zhhp1314520/articles/java_reflection_1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Reflection (JAVA反射) ----转载</title><link>http://www.blogjava.net/zhhp1314520/articles/java_reflection_2.html</link><dc:creator>捕风</dc:creator><author>捕风</author><pubDate>Mon, 12 Nov 2007 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/zhhp1314520/articles/java_reflection_2.html</guid><wfw:comment>http://www.blogjava.net/zhhp1314520/comments/159964.html</wfw:comment><comments>http://www.blogjava.net/zhhp1314520/articles/java_reflection_2.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhhp1314520/comments/commentRss/159964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhhp1314520/services/trackbacks/159964.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; Reflection 是 Java 程序开发语言的特征之一，它允许运行中的 Java
程序对自身进行检查，或者说&#8220;自审&#8221;，并能直接操作程序的内部属性。例如，使用它能获得 Java 类中各成员的名称并显示出来。Java
的这一能力在实际应用中也许用得不是很多，但是在其它的程序设计语言中根本就不存在这一特性。例如，Pascal、C 或者 C++
中就没有办法在程序中获得函数定义相关的信息。<br />
JavaBean 是 reflection 的实际应用之一，它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。<br />
<br />
1. 一个简单的例子<br />
考虑下面这个简单的例子，让我们看看 reflection 是如何工作的。<br />
import java.lang.reflect.*;<br />
public class DumpMethods {<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class c = Class.forName(args[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method m[] = c.getDeclaredMethods();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; m.length; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(m[i].toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<p><br />
按如下语句执行：<br />
java DumpMethods java.util.Stack<br />
<br />
它的结果输出为：<br />
public java.lang.Object java.util.Stack.push(java.lang.Object)<br />
public synchronized java.lang.Object java.util.Stack.pop()<br />
public synchronized java.lang.Object java.util.Stack.peek()<br />
public boolean java.util.Stack.empty()<br />
public synchronized int java.util.Stack.search(java.lang.Object)</p>
<p>这样就列出了java.util.Stack 类的各方法名以及它们的限制符和返回类型。</p>
<p>这个程序使用 Class.forName 载入指定的类，然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类。</p>
<br />
<p>2.开始使用 Reflection<br />
用
于 reflection 的类，如 Method，可以在 java.lang.relfect
包中找到。使用这些类的时候必须要遵循三个步骤：第一步是获得你想操作的类的 java.lang.Class 对象。在运行中的 Java
程序中，用 java.lang.Class 类来描述类和接口等。</p>
<p>下面就是获得一个 Class 对象的方法之一：<br />
Class c = Class.forName("java.lang.String");<br />
这条语句得到一个 String 类的类对象。还有另一种方法，如下面的语句：<br />
Class c = int.class;&nbsp;&nbsp; 或者&nbsp;&nbsp; Class c = Integer.TYPE;</p>
<p>它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 (如 Integer) 中预先定义好的 TYPE 字段。<br />
<br />
第二步是调用诸如 getDeclaredMethods 的方法，以取得该类中定义的所有方法的列表。<br />
<br />
一旦取得这个信息，就可以进行第三步了——使用 reflection API 来操作这些信息，如下面这段代码：<br />
Class c = Class.forName("java.lang.String");<br />
Method m[] = c.getDeclaredMethods();<br />
System.out.println(m[0].toString());<br />
它将以文本方式打印出 String 中定义的第一个方法的原型。<br />
在下面的例子中，这三个步骤将为使用 reflection 处理特殊应用程序提供例证。</p>
<br />
<p><br />
模拟 instanceof 操作符<br />
得到类信息之后，通常下一个步骤就是解决关于 Class 对象的一些基本的问题。例如，Class.isInstance 方法可以用于模拟 instanceof 操作符：<br />
class A {<br />
}<br />
<br />
public class instance1 {<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("A");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean b1 = cls.isInstance(new Integer(37));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(b1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean b2 = cls.isInstance(new A());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(b2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
在这个例子中创建了一个 A 类的 Class 对象，然后检查一些对象是否是 A 的实例。Integer(37) 不是，但 new A() 是。</p>
<p><br />
3.找出类的方法<br />
找出一个类中定义了些什么方法，这是一个非常有价值也非常基础的 reflection 用法。下面的代码就实现了这一用法：<br />
import java.lang.reflect.*;<br />
public class method1 {<br />
&nbsp;&nbsp;&nbsp; private int f1(Object p, int x) throws NullPointerException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (p == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NullPointerException();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("method1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method methlist[] = cls.getDeclaredMethods();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; methlist.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method m = methlist[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("name = " + m.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("decl class = " + m.getDeclaringClass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class pvec[] = m.getParameterTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; pvec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("param #" + j + " " + pvec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class evec[] = m.getExceptionTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; evec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("exc #" + j + " " + evec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("return type = " + m.getReturnType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("-----");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p><br />
这
个程序首先取得 method1 类的描述，然后调用 getDeclaredMethods 来获取一系列的 Method
对象，它们分别描述了定义在类中的每一个方法，包括 public 方法、protected 方法、package 方法和 private
方法等。如果你在程序中使用 getMethods 来代替 getDeclaredMethods，你还能获得继承来的各个方法的信息。<br />
<br />
取得了 Method 对象列表之后，要显示这些方法的参数类型、异常类型和返回值类型等就不难了。这些类型是基本类型还是类类型，都可以由描述类的对象按顺序给出。<br />
<br />
输出的结果如下：<br />
name = f1<br />
decl class = class method1<br />
param #0 class java.lang.Object<br />
param #1 int<br />
exc #0 class java.lang.NullPointerException<br />
return type = int<br />
-----<br />
name = main<br />
decl class = class method1<br />
param #0 class [Ljava.lang.String;<br />
return type = void<br />
-----</p>
<br />
<p>4.获取构造器信息<br />
获取类构造器的用法与上述获取方法的用法类似，如：<br />
import java.lang.reflect.*;<br />
public class constructor1 {<br />
&nbsp;&nbsp;&nbsp; public constructor1() {<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; protected constructor1(int i, double d) {<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("constructor1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor ctorlist[] = cls.getDeclaredConstructors();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; ctorlist.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor ct = ctorlist[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("name = " + ct.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("decl class = " + ct.getDeclaringClass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class pvec[] = ct.getParameterTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; pvec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("param #" + j + " " + pvec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class evec[] = ct.getExceptionTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; evec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("exc #" + j + " " + evec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("-----");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p><br />
这个例子中没能获得返回类型的相关信息，那是因为构造器没有返回类型。<br />
这个程序运行的结果是：<br />
name = constructor1<br />
decl class = class constructor1<br />
-----<br />
name = constructor1<br />
decl class = class constructor1<br />
param #0 int<br />
param #1 double<br />
-----<br />
<br />
5.获取类的字段(域)<br />
找出一个类中定义了哪些数据字段也是可能的，下面的代码就在干这个事情：<br />
import java.lang.reflect.*;<br />
<br />
public class field1 {<br />
&nbsp;&nbsp;&nbsp; private double d;<br />
&nbsp;&nbsp;&nbsp; public static final int i = 37;<br />
&nbsp;&nbsp;&nbsp; String s = "testing";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("field1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fieldlist[] = cls.getDeclaredFields();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; fieldlist.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fld = fieldlist[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("name = " + fld.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("decl class = " + fld.getDeclaringClass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("type = " + fld.getType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mod = fld.getModifiers();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("modifiers = " + Modifier.toString(mod));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("-----");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p><br />
这
个例子和前面那个例子非常相似。例中使用了一个新东西 Modifier，它也是一个 reflection
类，用来描述字段成员的修饰语，如&#8220;private int&#8221;。这些修饰语自身由整数描述，而且使用 Modifier.toString
来返回以&#8220;官方&#8221;顺序排列的字符串描述 (如&#8220;static&#8221;在&#8220;final&#8221;之前)。这个程序的输出是：<br />
name = d<br />
decl class = class field1<br />
type = double<br />
modifiers = private<br />
-----<br />
name = i<br />
decl class = class field1<br />
type = int<br />
modifiers = public static final<br />
-----<br />
name = s<br />
decl class = class field1<br />
type = class java.lang.String<br />
modifiers =<br />
-----<br />
<br />
和获取方法的情况一下，获取字段的时候也可以只取得在当前类中申明了的字段信息 (getDeclaredFields)，或者也可以取得父类中定义的字段 (getFields) 。</p>
<br />
<p>6.根据方法的名称来执行方法<br />
文本到这里，所举的例子无一例外都与如何获取类的信息有关。我们也可以用 reflection 来做一些其它的事情，比如执行一个指定了名称的方法。下面的示例演示了这一操作：<br />
import java.lang.reflect.*;<br />
public class method2 {<br />
&nbsp;&nbsp;&nbsp; public int add(int a, int b) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a + b;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("method2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class partypes[] = new Class[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[0] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[1] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method meth = cls.getMethod("add", partypes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method2 methobj = new method2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arglist[] = new Object[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[0] = new Integer(37);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[1] = new Integer(47);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object retobj = meth.invoke(methobj, arglist);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer retval = (Integer) retobj;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(retval.intValue());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p><br />
假如一个程序在执行的某处的时候才知道需要执行某个方法，这个方法的名称是在程序的运行过程中指定的 (例如，JavaBean 开发环境中就会做这样的事)，那么上面的程序演示了如何做到。</p>
<p><br />
上
例中，getMethod 用于查找一个具有两个整型参数且名为 add 的方法。找到该方法并创建了相应的 Method
对象之后，在正确的对象实例中执行它。执行该方法的时候，需要提供一个参数列表，这在上例中是分别包装了整数 37 和 47 的两个 Integer
对象。执行方法的返回的同样是一个 Integer 对象，它封装了返回值 84。</p>
<p><br />
7.创建新的对象<br />
对于构造器，则不能像执行方法那样进行，因为执行一个构造器就意味着创建了一个新的对象 (准确的说，创建一个对象的过程包括分配内存和构造对象)。所以，与上例最相似的例子如下：<br />
import java.lang.reflect.*;<br />
public class constructor2 {<br />
&nbsp;&nbsp;&nbsp; public constructor2() {<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public constructor2(int a, int b) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("a = " + a + " b = " + b);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("constructor2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class partypes[] = new Class[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[0] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[1] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor ct = cls.getConstructor(partypes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arglist[] = new Object[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[0] = new Integer(37);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[1] = new Integer(47);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object retobj = ct.newInstance(arglist);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
根据指定的参数类型找到相应的构造函数并执行它，以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象，而不是在编译的时候创建对象，这一点非常有价值。</p>
<p><br />
8.改变字段(域)的值<br />
reflection 的还有一个用处就是改变对象数据字段的值。reflection 可以从正在运行的程序中根据名称找到对象的字段并改变它，下面的例子可以说明这一点：<br />
import java.lang.reflect.*;<br />
public class field2 {<br />
&nbsp;&nbsp;&nbsp; public double d;<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("field2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fld = cls.getField("d");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; field2 f2obj = new field2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("d = " + f2obj.d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fld.setDouble(f2obj, 12.34);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("d = " + f2obj.d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p><br />
这个例子中，字段 d 的值被变为了 12.34。<br />
9.使用数组<br />
本文介绍的 reflection 的最后一种用法是创建的操作数组。数组在 Java 语言中是一种特殊的类类型，一个数组的引用可以赋给 Object 引用。观察下面的例子看看数组是怎么工作的：<br />
import java.lang.reflect.*;<br />
public class array1 {<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("java.lang.String");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arr = Array.newInstance(cls, 10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array.set(arr, 5, "this is a test");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = (String) Array.get(arr, 5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p><br />
例中创建了 10 个单位长度的 String 数组，为第 5 个位置的字符串赋了值，最后将这个字符串从数组中取得并打印了出来。<br />
<br />
下面这段代码提供了一个更复杂的例子：<br />
import java.lang.reflect.*;<br />
public class array2 {<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int dims[] = new int[]{5, 10, 15};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arr = Array.newInstance(Integer.TYPE, dims);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arrobj = Array.get(arr, 3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = arrobj.getClass().getComponentType();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(cls);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arrobj = Array.get(arrobj, 5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array.setInt(arrobj, 10, 37);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int arrcast[][][] = (int[][][]) arr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(arrcast[3][5][10]);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
例
中创建了一个 5 x 10 x 15 的整型数组，并为处于 [3][5][10] 的元素赋了值为
37。注意，多维数组实际上就是数组的数组，例如，第一个 Array.get 之后，arrobj 是一个 10 x 15
的数组。进而取得其中的一个元素，即长度为 15 的数组，并使用 Array.setInt 为它的第 10 个元素赋值。<br />
<br />
注意创建数组时的类型是动态的，在编译时并不知道其类型。</p>
<img src ="http://www.blogjava.net/zhhp1314520/aggbug/159964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhhp1314520/" target="_blank">捕风</a> 2007-11-12 14:24 <a href="http://www.blogjava.net/zhhp1314520/articles/java_reflection_2.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ProcessFileObject </title><link>http://www.blogjava.net/zhhp1314520/articles/ProcessFileObject.html</link><dc:creator>捕风</dc:creator><author>捕风</author><pubDate>Fri, 30 Mar 2007 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/zhhp1314520/articles/ProcessFileObject.html</guid><wfw:comment>http://www.blogjava.net/zhhp1314520/comments/107566.html</wfw:comment><comments>http://www.blogjava.net/zhhp1314520/articles/ProcessFileObject.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhhp1314520/comments/commentRss/107566.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhhp1314520/services/trackbacks/107566.html</trackback:ping><description><![CDATA[
		<p>package test;</p>
		<p>import java.io.File;<br />import java.io.FileInputStream;<br />import java.io.FileOutputStream;<br />import java.io.IOException;<br />import java.io.ObjectInputStream;<br />import java.io.ObjectOutputStream;<br />import java.io.Serializable;<br />import java.util.ArrayList;<br />import java.util.Iterator;</p>
		<p>public class ProcessFileObject {</p>
		<p> protected String filename = "";</p>
		<p> protected ProcessFileObject(String filename) {<br />  this.filename = filename;<br /> }</p>
		<p> public ObjectOutputStream oos = null;</p>
		<p> public ObjectInputStream ios = null;</p>
		<p> public synchronized boolean insertAssignInfo(String assignid,<br />   String assigncode, String assignname) {</p>
		<p>  ArrayList alist = new ArrayList();<br />  Assign assign = new Assign();<br />  assign.setAssigncode(assigncode);<br />  assign.setAssignid(assignid);<br />  assign.setAssignname(assignname);<br />  /*try {<br />   System.out.println(filename);<br />   ios = new ObjectInputStream(new FileInputStream(new File(filename)));<br />   alist = (ArrayList) ios.readObject();<br />   ios.close();<br />  } catch (IOException ioe) {<br />   ioe.printStackTrace();<br />  } catch (ClassNotFoundException cnfe) {</p>
		<p>  }*/<br />  if (!alist.add(assign)) {<br />   return false;<br />  }</p>
		<p>  try {<br />   oos = new ObjectOutputStream(new FileOutputStream(new File(filename)));<br />   oos.writeObject(alist);<br />   oos.close();<br />  } catch (IOException ioe) {<br />   ioe.printStackTrace();<br />  }<br />  return true;<br /> }</p>
		<p> public synchronized boolean existAssignInfo(String assignid,<br />   String assigncode, String assignname) {</p>
		<p>  ArrayList alist = null;<br />  Assign assign = null;<br />  try {<br />   ios = new ObjectInputStream(new FileInputStream(filename));<br />   alist = (ArrayList) ios.readObject();<br />   ios.close();<br />  } catch (IOException ioe) {</p>
		<p>  } catch (ClassNotFoundException cnfe) {</p>
		<p>  }<br />  Iterator iter = alist.iterator();<br />  while (iter.hasNext()) {<br />   assign = (Assign) iter.next();<br />   if (assign.getAssigncode().equals(assigncode)<br />     &amp;&amp; assign.getAssignid().equals(assignid)<br />     &amp;&amp; assign.getAssignname().equals(assignname)) {<br />    return true;<br />   }<br />  }</p>
		<p>  return false;<br /> }</p>
		<p> public synchronized boolean removebyAssigncode(String assigncode) {</p>
		<p>  ArrayList alist = null;<br />  Assign assign = null;<br />  try {<br />   ios = new ObjectInputStream(new FileInputStream(filename));<br />   alist = (ArrayList) ios.readObject();<br />   ios.close();<br />  } catch (IOException ioe) {</p>
		<p>  } catch (ClassNotFoundException cnfe) {</p>
		<p>  }<br />  for (int i = 0, j = alist.size(); i &lt; j; i++) {<br />   assign = (Assign) alist.get(i);<br />   if (assign.getAssigncode().equals(assigncode)) {<br />    alist.remove(i);<br />   }<br />  }<br />  try {<br />   oos = new ObjectOutputStream(new FileOutputStream(filename));<br />   oos.writeObject(alist);<br />   oos.close();<br />  } catch (IOException ioe) {</p>
		<p>  }</p>
		<p>  return true;<br /> }</p>
		<p> public synchronized boolean removeAll() {</p>
		<p>  ArrayList alist = null;<br />  try {<br />   oos = new ObjectOutputStream(new FileOutputStream(filename));<br />   oos.writeObject(alist);<br />   oos.close();<br />  } catch (IOException ioe) {</p>
		<p>  }</p>
		<p>  return true;<br /> }</p>
		<p> public class Assign implements Serializable {<br />  public String assignid;</p>
		<p>  public String assigncode;</p>
		<p>  public String assignname;</p>
		<p>  public Assign() {</p>
		<p>  }</p>
		<p>  public String getAssigncode() {<br />   return assigncode;<br />  }</p>
		<p>  public void setAssigncode(String assigncode) {<br />   this.assigncode = assigncode;<br />  }</p>
		<p>  public String getAssignid() {<br />   return assignid;<br />  }</p>
		<p>  public void setAssignid(String assignid) {<br />   this.assignid = assignid;<br />  }</p>
		<p>  public String getAssignname() {<br />   return assignname;<br />  }</p>
		<p>  public void setAssignname(String assignname) {<br />   this.assignname = assignname;<br />  }<br /> }</p>
		<p>}</p>
<img src ="http://www.blogjava.net/zhhp1314520/aggbug/107566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhhp1314520/" target="_blank">捕风</a> 2007-03-30 23:02 <a href="http://www.blogjava.net/zhhp1314520/articles/ProcessFileObject.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j</title><link>http://www.blogjava.net/zhhp1314520/articles/log4j_config.html</link><dc:creator>捕风</dc:creator><author>捕风</author><pubDate>Mon, 26 Mar 2007 12:30:00 GMT</pubDate><guid>http://www.blogjava.net/zhhp1314520/articles/log4j_config.html</guid><wfw:comment>http://www.blogjava.net/zhhp1314520/comments/106512.html</wfw:comment><comments>http://www.blogjava.net/zhhp1314520/articles/log4j_config.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhhp1314520/comments/commentRss/106512.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhhp1314520/services/trackbacks/106512.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal">
				<span lang="EN-US">Log4j</span>
				<span style="FONT-FAMILY: 宋体">实在是很熟悉，几乎所有的</span>
				<span lang="EN-US">Java</span>
				<span style="FONT-FAMILY: 宋体">项目都用它啊。但是我确一直没有搞明白。终于有一天我受不了了，定下心去看了一把文档，才两个小时，我终于搞明白了。一般情况下</span>
				<span lang="EN-US">Log4j</span>
				<span style="FONT-FAMILY: 宋体">总是和</span>
				<span lang="EN-US">Apache Commons-logging</span>
				<span style="FONT-FAMILY: 宋体">一起用的，我也就一起介绍吧。多了个东西不是更麻烦，而是更简单！</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<?xml:namespace prefix = o /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt;<span lang="EN-US"><span>一、</span></span>&lt;!--[endif]--&gt;<span lang="EN-US">Log4j</span><span style="FONT-FAMILY: 宋体">的简单思想</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US">Log4j</span>
				<span style="FONT-FAMILY: 宋体">真的很简单，简单到令人发指的地步。不是要记录日志吗？那就给你一个</span>
				<span lang="EN-US">Log</span>
				<span style="FONT-FAMILY: 宋体">，然后你用</span>
				<span lang="EN-US">Log</span>
				<span style="FONT-FAMILY: 宋体">来写东西就行了，先来一个完整类示例：</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left">
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">package</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">test;</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left">
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">import</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">org.apache.commons.logging.Log;</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left">
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">import</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">org.apache.commons.logging.LogFactory;</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left">
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">public</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
				</span>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">class</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">Test {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>    </span>
						<span>    </span>
				</span>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">static</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">Log </span>
				<em>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(0,0,192); FONT-FAMILY: 'Courier New'">log</span>
				</em>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">= LogFactory.<em>getLog</em>(Test.</span>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">class</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">);<br />        //protected final Log log = LogFactory.getLog(this.getClass());<br /></span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>    </span>
						<span>    </span>
				</span>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">public</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
				</span>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">void</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">log(){</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>       </span>
						<span>    </span>
				</span>
				<em>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(0,0,192); FONT-FAMILY: 'Courier New'">log</span>
				</em>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">.debug(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">"Debug info."</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>       </span>
						<span>    </span>
				</span>
				<em>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(0,0,192); FONT-FAMILY: 'Courier New'">log</span>
				</em>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">.info(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">"Info info"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>       </span>
						<span>    </span>
				</span>
				<em>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(0,0,192); FONT-FAMILY: 'Courier New'">log</span>
				</em>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">.warn(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">"Warn info"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>       </span>
						<span>    </span>
				</span>
				<em>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(0,0,192); FONT-FAMILY: 'Courier New'">log</span>
				</em>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">.error(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">"Error info"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>       </span>
						<span>    </span>
				</span>
				<em>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(0,0,192); FONT-FAMILY: 'Courier New'">log</span>
				</em>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">.fatal(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">"Fatal info"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>    </span>
						<span>    </span>}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>    </span>
						<span>    </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(63,95,191); FONT-FAMILY: 'Courier New'">/**</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>    </span>
						<span> </span>
						<span>   </span>
						<span> </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(63,95,191); FONT-FAMILY: 'Courier New'">*</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
				</span>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,159,191); FONT-FAMILY: 'Courier New'">@param</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(63,95,191); FONT-FAMILY: 'Courier New'">args</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>    </span>
						<span> </span>
						<span>   </span>
						<span> </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(63,95,191); FONT-FAMILY: 'Courier New'">*/</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>    </span>
						<span>    </span>
				</span>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">public</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
				</span>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">static</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
				</span>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">void</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">main(String[] args) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>       </span>
						<span>    </span>Test test = </span>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">new</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">Test();</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>       </span>
						<span>    </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">test<span style="COLOR: black">.log();</span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
						<span>    </span>
						<span>    </span>}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt" color:="" new="" courier="">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">别怕，看完这篇文章你就会觉得很简单了。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<span>
						</span>        Log4j</span>
				<span style="FONT-FAMILY: 宋体">默认把日志信息分为五个等级</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<span>
						</span>
				</span>
				<span lang="EN-US" new="" courier="">        debug &lt; info &lt; warn &lt; error &lt; fatal<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">虽然可以自己添加等级，但是我觉得没有必要，五个够用了吧！你要写入信息的时候就把信息归为五个等级中的一个，然后调用相应的函数即可。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<span>
						</span>
				</span>
				<span style="FONT-FAMILY: 宋体">    分五个等级到底有什么用呢？日志信息到底写到哪里去了？</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<span>
						</span>
				</span>
				<span style="FONT-FAMILY: 宋体">    “</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt" color:="" new="" courier="">LogFactory.<em>getLog</em>(Test.</span>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt" color:="" new="" courier="">class</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt" color:="" new="" courier="">)</span>
				<span style="FONT-FAMILY: 宋体">”又是什么意思捏？接着往下看吧！</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US">Log4j</span>
				<span style="FONT-FAMILY: 宋体">的关键之处在于它的继承思想。也就是一个</span>
				<span lang="EN-US">Log</span>
				<span style="FONT-FAMILY: 宋体">可以继承另外一个</span>
				<span lang="EN-US">Log</span>
				<span style="FONT-FAMILY: 宋体">的属性（输出到哪里，日志等级，日志格式等等）。怎么继承？</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US">Log4j</span>
				<span style="FONT-FAMILY: 宋体">是根据</span>
				<span lang="EN-US">Log</span>
				<span style="FONT-FAMILY: 宋体">的名字来判断继承关系的，比如：</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">名字为“</span>
				<span lang="EN-US">com.zhlmmc.lib</span>
				<span style="FONT-FAMILY: 宋体">”的</span>
				<span lang="EN-US">Log</span>
				<span style="FONT-FAMILY: 宋体">就是“</span>
				<span lang="EN-US">com.zhlmmc.lib.log</span>
				<span style="FONT-FAMILY: 宋体">”的</span>
				<span lang="EN-US">parent</span>
				<span style="FONT-FAMILY: 宋体">，明白了吧！</span>
				<span lang="EN-US">Log4j</span>
				<span style="FONT-FAMILY: 宋体">还有一个</span>
				<span lang="EN-US">rootLogger</span>
				<span style="FONT-FAMILY: 宋体">，相当于</span>
				<span lang="EN-US">Java</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">Object</span>
				<span style="FONT-FAMILY: 宋体">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">回过头来看“</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">LogFactory.<em>getLog</em>(Test.</span>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">class</span>
				</strong>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">)</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt" color:="" new="" courier="">
						<span style="FONT-FAMILY: 宋体">”这里的“</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">Test.</span>
						<strong>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(127,0,85); FONT-FAMILY: 'Courier New'">class</span>
						</strong>
						<strong>
								<span lang="EN-US" style="FONT-SIZE: 10pt" color:="" new="" courier="">
								</span>
						</strong>
						<span style="FONT-FAMILY: 宋体">”事实上传进去的是</span>
						<span lang="EN-US">Test</span>
						<span style="FONT-FAMILY: 宋体">这个类的完整路径（包名</span>
						<span lang="EN-US">+</span>
						<span style="FONT-FAMILY: 宋体">类名），“</span>
						<span lang="EN-US">test.Test</span>
						<span style="FONT-FAMILY: 宋体">”。这样如果存在“</span>
						<span lang="EN-US">test</span>
						<span style="FONT-FAMILY: 宋体">”这个</span>
						<span lang="EN-US">Log</span>
						<span style="FONT-FAMILY: 宋体">那么</span>
						<span lang="EN-US">Test</span>
						<span style="FONT-FAMILY: 宋体">这个</span>
						<span lang="EN-US">Log</span>
						<span style="FONT-FAMILY: 宋体">就继承它，否则就继承</span>
						<span lang="EN-US">rootLogger</span>
						<span style="FONT-FAMILY: 宋体">。</span>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<span>
						</span>
				</span>
				<span style="FONT-FAMILY: 宋体">    那具体的</span>
				<span lang="EN-US">Log</span>
				<span style="FONT-FAMILY: 宋体">属性是在哪里定义的呢？</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt;<span lang="EN-US"><span>二、</span></span>&lt;!--[endif]--&gt;<span style="FONT-FAMILY: 宋体">常见的配置文件</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">虽然可以用</span>
				<span lang="EN-US">xml</span>
				<span style="FONT-FAMILY: 宋体">或者在运行时用</span>
				<span lang="EN-US">Java</span>
				<span style="FONT-FAMILY: 宋体">来配置</span>
				<span lang="EN-US">Log4j</span>
				<span style="FONT-FAMILY: 宋体">，但还是</span>
				<span lang="EN-US">properties</span>
				<span style="FONT-FAMILY: 宋体">文件好用啊！</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">log4j.rootLogger=</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">info,</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">stdout</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">log4j.appender.stdout=</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">org.apache.log4j.ConsoleAppender</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">log4j.appender.stdout.layout=</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">org.apache.log4j.PatternLayout</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(63,127,95); FONT-FAMILY: 'Courier New'"># Pattern to output the caller's file name and line number.</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">log4j.appender.stdout.layout.ConversionPattern=</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">%5p</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">[%t]</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">(%F</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">:</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">%L)</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">-</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">%m%n<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt" color:="" new="" courier="">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">分析一下：</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">第一行，配置</span>
				<span lang="EN-US">log4j.rootLogger</span>
				<span style="FONT-FAMILY: 宋体">你明白吧。应为它是根，总得配置一下，否则别的</span>
				<span lang="EN-US">Log</span>
				<span style="FONT-FAMILY: 宋体">继承什么啊。其他的</span>
				<span lang="EN-US">Log</span>
				<span style="FONT-FAMILY: 宋体">可以配置也可以不配置。等号后面的第一个参数表示日志级别，可以填五个级别中的一种，后面的参数都是让</span>
				<span lang="EN-US">Log</span>
				<span style="FONT-FAMILY: 宋体">知道输出到哪里，如果你想让日志输出到两个地方就加两个输出参数，比如：</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">log4j.rootLogger=</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">info,</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">stdout, file</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt" color:="" new="" courier="">
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">这里的</span>
				<span lang="EN-US">info</span>
				<span style="FONT-FAMILY: 宋体">表示，该</span>
				<span lang="EN-US">Log</span>
				<span style="FONT-FAMILY: 宋体">的日志级别为</span>
				<span lang="EN-US">info</span>
				<span style="FONT-FAMILY: 宋体">，所有级别小于</span>
				<span lang="EN-US">info</span>
				<span style="FONT-FAMILY: 宋体">的日志都不会被记录。比如使用这个配置文件的话，我刚开始举的那个类中</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<em>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(0,0,192); FONT-FAMILY: 'Courier New'">log</span>
				</em>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">.debug(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">"Debug info."</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt" color:="" new="" courier="">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">这句话是不起作用的，因为</span>
				<span lang="EN-US">debug</span>
				<span style="FONT-FAMILY: 宋体">的级别小于</span>
				<span lang="EN-US">info</span>
				<span style="FONT-FAMILY: 宋体">。这样就很容易控制什么信息在调试的时候要显示，什么信息在发布的时候要去掉。这些都不用改代码，很方便吧。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<span>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">但，</span>
				<span lang="EN-US">stdout</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">file</span>
				<span style="FONT-FAMILY: 宋体">又是什么呢？</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">接着往下看，就是配置</span>
				<span lang="EN-US">stdout</span>
				<span style="FONT-FAMILY: 宋体">了，这个名字是随便取的，你可以叫它</span>
				<span lang="EN-US">A</span>
				<span style="FONT-FAMILY: 宋体">：</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">log4j.appender.A=</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">org.apache.log4j.ConsoleAppender</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt" color:="" new="" courier="">
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">那么上面的</span>
				<span lang="EN-US">rootLogger</span>
				<span style="FONT-FAMILY: 宋体">的参数</span>
				<span lang="EN-US">stdout</span>
				<span style="FONT-FAMILY: 宋体">也要改成</span>
				<span lang="EN-US">A</span>
				<span style="FONT-FAMILY: 宋体">，其他用到的地方当然也要改。这里的关键不是名字，而是</span>
				<span lang="EN-US">appender</span>
				<span style="FONT-FAMILY: 宋体">类型，比如这里的“</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">ConsoleAppender</span>
				<span style="FONT-FAMILY: 宋体">”，看明白了吧，输出到</span>
				<span lang="EN-US">Console</span>
				<span style="FONT-FAMILY: 宋体">。后面两行都是设置日志格式的，一般情况下你就照抄吧。既然是最简入门关注于理解</span>
				<span lang="EN-US">Log4j</span>
				<span style="FONT-FAMILY: 宋体">的工作原理，我就不介绍</span>
				<span lang="EN-US">file</span>
				<span style="FONT-FAMILY: 宋体">类型的</span>
				<span lang="EN-US">appender</span>
				<span style="FONT-FAMILY: 宋体">了，一搜一大把。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">在实际的项目开发中，很可能遇到所引用的包用</span>
				<span lang="EN-US">Log4j</span>
				<span style="FONT-FAMILY: 宋体">来记录日志，比如</span>
				<span lang="EN-US">Hibernate</span>
				<span style="FONT-FAMILY: 宋体">。那么在这里你可以很容易的控制这个包如何记录日志。比如在上面的配置文件中加一行：</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">log4j.logger.org.hibernate=</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: rgb(42,0,255); FONT-FAMILY: 'Courier New'">fatal</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt" color:="" new="" courier="">
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<span>
						</span>
				</span>
				<span style="FONT-FAMILY: 宋体">    那么所有</span>
				<span lang="EN-US">org.hibernate</span>
				<span style="FONT-FAMILY: 宋体">包下面的类就只会显示很少的信息，因为</span>
				<span lang="EN-US">fatal</span>
				<span style="FONT-FAMILY: 宋体">的级别最高啊。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&lt;!--[if !supportLists]--&gt;<span lang="EN-US"><span>三、</span></span>&lt;!--[endif]--&gt;<span style="FONT-FAMILY: 宋体">部署</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">别怕，这可不是部署</span>
				<span lang="EN-US">Tomcat</span>
				<span style="FONT-FAMILY: 宋体">。把</span>
				<span lang="EN-US">log4j</span>
				<span style="FONT-FAMILY: 宋体">的包和</span>
				<span lang="EN-US">commons-logging</span>
				<span style="FONT-FAMILY: 宋体">的包（加在一起才两个）放到</span>
				<span lang="EN-US">classpath</span>
				<span style="FONT-FAMILY: 宋体">下面。然后把配置文件保存为</span>
				<span lang="EN-US">log4j.properties</span>
				<span style="FONT-FAMILY: 宋体">，也放在</span>
				<span lang="EN-US">classpath</span>
				<span style="FONT-FAMILY: 宋体">下面（如果用</span>
				<span lang="EN-US">Eclipse</span>
				<span style="FONT-FAMILY: 宋体">的话，放在</span>
				<span lang="EN-US">src</span>
				<span style="FONT-FAMILY: 宋体">目录下即可）。然后你就可以跑了。</span>
		</p>
<img src ="http://www.blogjava.net/zhhp1314520/aggbug/106512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhhp1314520/" target="_blank">捕风</a> 2007-03-26 20:30 <a href="http://www.blogjava.net/zhhp1314520/articles/log4j_config.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在快捷方式中设置java环境变量</title><link>http://www.blogjava.net/zhhp1314520/articles/java_jre.html</link><dc:creator>捕风</dc:creator><author>捕风</author><pubDate>Thu, 11 Jan 2007 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/zhhp1314520/articles/java_jre.html</guid><wfw:comment>http://www.blogjava.net/zhhp1314520/comments/93158.html</wfw:comment><comments>http://www.blogjava.net/zhhp1314520/articles/java_jre.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhhp1314520/comments/commentRss/93158.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhhp1314520/services/trackbacks/93158.html</trackback:ping><description><![CDATA[D:\app\eclipse\eclipse.exe -vm D:\bea\jdk142_04\bin\javaw.exe -vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=20M -Xms64M -Xmx256M<img src ="http://www.blogjava.net/zhhp1314520/aggbug/93158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhhp1314520/" target="_blank">捕风</a> 2007-01-11 14:33 <a href="http://www.blogjava.net/zhhp1314520/articles/java_jre.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>