﻿<?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/J2EE</title><link>http://www.blogjava.net/beijingsoft/category/13377.html</link><description>致力于B/S商业软件快速开发框架平台建设</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:41:39 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:41:39 GMT</pubDate><ttl>60</ttl><item><title>在JAVA中动态执行类的静态方法</title><link>http://www.blogjava.net/beijingsoft/articles/70063.html</link><dc:creator>无为</dc:creator><author>无为</author><pubDate>Sat, 16 Sep 2006 10:38:00 GMT</pubDate><guid>http://www.blogjava.net/beijingsoft/articles/70063.html</guid><wfw:comment>http://www.blogjava.net/beijingsoft/comments/70063.html</wfw:comment><comments>http://www.blogjava.net/beijingsoft/articles/70063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beijingsoft/comments/commentRss/70063.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beijingsoft/services/trackbacks/70063.html</trackback:ping><description><![CDATA[
		<font face="Courier New">
				<font color="#008000">    在JAVA中，通过<font style="BACKGROUND-COLOR: #ffff00">Class.forName</font>()方法可以动态决定加载哪一个类，这个功能对于相同接口的不同实现来讲非常有用。比如对于设计好的数据库连接池接口，我们可以有多种的接口实现类来完成相同的功能，同时用户可以简单的通过修改配置文件来指定实际使用哪一个实现类，在源代码里面通过读取配置文件信息，并用<font style="BACKGROUND-COLOR: #ffff00">Class.forName</font>(configClassName).getInstance()就可以构造一个特定的实现类实例，而不用每次修改源代码。这样对于程序来讲只用关心接口的定义，用户只用进行配置文件的设置就完成了同一功能的不同实现的切换。<br />但是如果实现类需要通过静态方法来进行初始化的时候，动态加载的过程就会复杂一些。同样的以数据库连接池为例，通常连接池的构造函数都会被定义为私有的，而通过自定义的getInstance()静态方法来得到唯一实例。这种情况下简单的通过<font style="BACKGROUND-COLOR: #ffff00">Class.forName</font>().getInstance()就无法正确构造实例。<br />幸好JAVA所提供的反射机制(Reflection)为我们提供了完整了探悉类内部结构的方法。通过反射机制，我们能够完成基本上所有的运行时决定的动作(虽然这一实现要比其他动态语言，比如PHP，的eval()的使用要复杂的多)。 <br /><br />下面通过实际的例子说明如何在运行时动态访问类的静态方法。<br />-------------------------------------------------------<br /><span style="COLOR: #008000">*/</span></font>
				<span style="COLOR: #000000">
				</span>
				<br />
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.lang.reflect.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">;</span>
				<br />
				<br />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">
				</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> myTestClass{</span>
				<br />    <span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> Object pLock </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Object();</span><br /><br />    <span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> myTestClass p_instance </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;</span><br />    <span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> String s_configName </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"></span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">;</span><br />    <span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> b_isFromResource </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;</span><br /><br />    <span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">static</span></font>
		<font face="Courier New">
				<span style="COLOR: #000000"> Object getInstance(String sConfigName,<br />                                        Boolean bIsFromResource){</span>
				<br />        <span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000">(pLock){</span><br />            <span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"></span><span style="COLOR: #000000">==</span></font>
		<font face="Courier New">
				<span style="COLOR: #000000"> p_instance){<br />                p_instance </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">
				</span>
				<br />                    <span style="COLOR: #0000ff">new</span></font>
		<font face="Courier New">
				<span style="COLOR: #000000"> myTestClass(sConfigName,bIsFromResource);<br />            }<br />        }</span>
				<br />        <span style="COLOR: #0000ff">return</span></font>
		<font face="Courier New">
				<span style="COLOR: #000000"> p_instance;<br />    }</span>
				<br />
				<br />    <span style="COLOR: #0000ff">private</span></font>
		<font face="Courier New">
				<span style="COLOR: #000000"> myTestClass(String sConfigName,Boolean bIsFromResource){<br />        s_configName </span>
				<span style="COLOR: #000000">=</span>
		</font>
		<font face="Courier New">
				<span style="COLOR: #000000"> sConfigName;<br />        b_isFromResource </span>
				<span style="COLOR: #000000">=</span>
		</font>
		<font face="Courier New">
				<span style="COLOR: #000000"> bIsFromResource.booleanValue();<br />    }</span>
				<br />
				<br />    <span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span></font>
		<font face="Courier New">
				<span style="COLOR: #000000"> echoInfo(){<br />        System.out.println(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">current arguments : configName=[</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">+</span>
		</font>
		<span style="COLOR: #000000">
				<br />
				<font face="Courier New">                            s_configName</font>
		</span>
		<font face="Courier New">
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">],isFromResource=[</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">+</span>
		</font>
		<span style="COLOR: #000000">
				<br />
				<font face="Courier New">                            b_isFromResource</font>
		</span>
		<font face="Courier New">
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">]</span>
				<span style="COLOR: #000000">"</span>
		</font>
		<font face="Courier New">
				<span style="COLOR: #000000">);<br />    }</span>
				<br />
				<br />    <span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main(String[] args) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception{</span><br />        <span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 设置方法的传入参数的类型. </span><span style="COLOR: #008000"></span><br /><span style="COLOR: #000000">        Class[] parameterTypes </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">new</span></font>
		<font face="Courier New">
				<span style="COLOR: #000000"> Class[]{<br />                                    java.lang.String.</span>
				<span style="COLOR: #0000ff">class</span>
		</font>
		<font face="Courier New">
				<span style="COLOR: #000000">,<br />                                    java.lang.Boolean.</span>
				<span style="COLOR: #0000ff">class</span>
		</font>
		<span style="COLOR: #000000">
				<br />
				<font face="Courier New">                                    };<br /><br />        Method mGetInstance </font>
		</span>
		<font face="Courier New">
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">
				</span>
				<span style="COLOR: #0000ff">null</span>
		</font>
		<font face="Courier New">
				<span style="COLOR: #000000">;<br />        String className </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">
				</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">myTestClass</span>
				<span style="COLOR: #000000">"</span>
		</font>
		<font face="Courier New">
				<span style="COLOR: #000000">;<br /><br />        Class curTestClass </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">
						<font style="BACKGROUND-COLOR: #ffff00">Class.forName</font>(className);</span>
				<br />        <span style="COLOR: #0000ff">try</span></font>
		<font face="Courier New">
				<span style="COLOR: #000000">{<br />            mGetInstance </span>
				<span style="COLOR: #000000">=</span>
		</font>
		<font face="Courier New">
				<span style="COLOR: #000000"> curTestClass.<br />                            getMethod(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">getInstance</span>
				<span style="COLOR: #000000">"</span>
		</font>
		<font face="Courier New">
				<span style="COLOR: #000000">,parameterTypes);<br />        }</span>
				<br />        <span style="COLOR: #0000ff">catch</span></font>
		<font face="Courier New">
				<span style="COLOR: #000000">(NoSuchMethodException e){<br />            e.printStackTrace();<br />            mGetInstance </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">
				</span>
				<span style="COLOR: #0000ff">null</span>
		</font>
		<font face="Courier New">
				<span style="COLOR: #000000">;<br />        }</span>
				<br />
				<br />        <span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(mGetInstance </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">null</span></font>
		<font face="Courier New">
				<span style="COLOR: #000000">){<br /><br />            myTestClass pObj </span>
				<span style="COLOR: #000000">=</span>
		</font>
		<font face="Courier New">
				<span style="COLOR: #000000"> (myTestClass)<br />                                mGetInstance.invoke(</span>
				<br />                                    <span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">,</span><br />                                    <span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Object[]{</span><br />                                        <span style="COLOR: #000000">"</span><span style="COLOR: #000000">src/myconfig.properties</span><span style="COLOR: #000000">"</span></font>
		<font face="Courier New">
				<span style="COLOR: #000000">,<br />                                        Boolean.FALSE<br />                                    }<br />                                );<br /><br />            pObj.echoInfo();<br />        }</span>
				<br />        <span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">{</span><br />            <span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"></span><br />            <span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Exception(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">myTest Init Failed from class</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"></span><span style="COLOR: #000000">+</span></font>
		<span style="COLOR: #000000">
				<br />
				<font face="Courier New">                                className </font>
		</span>
		<span style="COLOR: #000000">
				<font face="Courier New">+</font>
		</span>
		<span style="COLOR: #000000">
				<br />
				<font face="Courier New">                                System.getProperty(</font>
		</span>
		<font face="Courier New">
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">line.seperator</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">\n</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">) </span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000">
				</span>
				<br />                                <span style="COLOR: #000000">"</span><span style="COLOR: #000000">method getInstance(String, Boolean) exists.</span><span style="COLOR: #000000">"</span></font>
		<span style="COLOR: #000000">
				<font face="Courier New">);<br />        }<br />    }<br />}</font>
		</span>  <br /><br /><img src ="http://www.blogjava.net/beijingsoft/aggbug/70063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beijingsoft/" target="_blank">无为</a> 2006-09-16 18:38 <a href="http://www.blogjava.net/beijingsoft/articles/70063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>