<%@ page contentType="text/html; charset=gb2312"%> 在Java中动态执行类的静态方法
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
在Java中动态执行类的静态方法
     发布者: 发布时间:2006-10-17
  在Java中,通过Class.forName()方法可以动态决定加载哪一个类,这个功能对于相同接口的不同实现来讲非常有用。比如对于设计好的数据库连接池接口,我们可以有多种的接口实现类来完成相同的功能,同时用户可以简单的通过修改配置文件来指定实际使用哪一个实现类,在源代码里面通过读取配置文件信息,并用Class.forName(configClassName).getInstance()就可以构造一个特定的实现类实例,而不用每次修改源代码。这样对于程序来讲只用关心接口的定义,用户只用进行配置文件的设置就完成了同一功能的不同实现的切换。

  但是如果实现类需要通过静态方法来进行初始化的时候,动态加载的过程就会复杂一些。同样的以数据库连接池为例,通常连接池的构造函数都会被定义为私有的,而通过自定义的getInstance()静态方法来得到唯一实例。这种情况下简单的通过Class.forName().getInstance()就无法正确构造实例。

  幸好Java所提供的反射机制(Reflection)为我们提供了完整了探悉类内部结构的方法。通过反射机制,我们能够完成基本上所有的运行时决定的动作(虽然这一实现要比其他动态语言,比如PHP,的eval()的使用要复杂的多)。

  下面通过实际的例子说明如何在运行时动态访问类的静态方法。

-------------------------------------------------------
*/
import java.lang.reflect.*;

public class myTestClass{
 private static Object pLock = new Object();

 private static myTestClass p_instance = null;
 private String s_configName = "";
 private boolean b_isFromResource = true;

 public static Object getInstance(String sConfigName,
 Boolean bIsFromResource){
  synchronized(pLock){
   if(null == p_instance){
    p_instance =new myTestClass(sConfigName,bIsFromResource);
   }
  }
  return p_instance;
 } 

 private myTestClass(String sConfigName,Boolean bIsFromResource){
  s_configName = sConfigName;
  b_isFromResource = bIsFromResource.booleanValue();
 }

 public void echoInfo(){
  System.out.println("current arguments : configName=["+
   s_configName+"],isFromResource=["+b_isFromResource+"]");
 }

 public static void main(String[] args) throws Exception{
  // 设置方法的传入参数的类型.
  Class[] parameterTypes = new Class[]{
   java.lang.String.class,
   java.lang.Boolean.class
  };

  Method mGetInstance = null;
  String className = "myTestClass";

  Class curTestClass = Class.forName(className);
  try{
   mGetInstance = curTestClass.getMethod("getInstance",parameterTypes);
  }
  catch(NoSuchMethodException e){
   e.printStackTrace();
   mGetInstance = null;
  }

  if(mGetInstance != null){
   myTestClass pObj = (myTestClass)
    mGetInstance.invoke(null,new Object[]{
     "src/myconfig.properties",
     Boolean.FALSE
    }
   );
   pObj.echoInfo();
  }
  else{
   throw
    new Exception("myTest Init Failed from class" +
     className +
     System.getProperty("line.seperator","\n") +
     "method getInstance(String, Boolean) exists.");
  }
 }
}
 
(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
JDK1.5新特性介绍
Java开发工具大比拼
在Eclipse使用的快捷键
关于Tomcat 5.5连接池的配置问题
JSP中tomcat的SQL Server2000数据库连接池的配置
Oracle 10i的安装过程
 
最近评论:
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(1465)
        
冰封的往事!
wow power leveling,wow gold,wow power leveling,wow gold max(6106)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号