北方站长站
客服热线:0632-5117766

在Java中动态执行类的静态方法

[2006-09-12 00:00:00] 作者:Northz.com 来源:北方站长站

Tags:方法 静态 执行 动态 通过 myTestClass 实现 null String

  

比如对于设计好的数据库连接池接口,我们可以有多种的接口实现类来完成相同的功能,同时用户可以简单的通过修改配置文件来指定实际使用哪一个实现类,在源代码里面通过读取配置文件信息,并用Class.forName(configClassName).getInstance()就可以构造一个特定的实现类实例,而不用每次修改源代码。这样对于程序来讲只用关心接口的定义,用户只用进行配置文件的设置就完成了同一功能的不同实现的切换。Y7C北方站长站
  但是如果实现类需要通过静态方法来进行初始化的时候,动态加载的过程就会复杂一些。同样的以数据库连接池为例,通常连接池的构造函数都会被定义为私有的,而通过自定义的getInstance()静态方法来得到唯一实例。这种情况下简单的通过Class.forName().getInstance()就无法正确构造实例。Y7C北方站长站
  幸好Java所提供的反射机制(Reflection)为我们提供了完整了探悉类内部结构的方法。通过反射机制,我们能够完成基本上所有的运行时决定的动作(虽然这一实现要比其他动态语言,比如PHP,的eval()的使用要复杂的多)。 Y7C北方站长站
  下面通过实际的例子说明如何在运行时动态访问类的静态方法。Y7C北方站长站
-------------------------------------------------------Y7C北方站长站
*/Y7C北方站长站
import java.lang.reflect.*;Y7C北方站长站
public class myTestClass{Y7C北方站长站
 private static Object pLock = new Object();Y7C北方站长站
 private static myTestClass p_instance = null;Y7C北方站长站
 private String s_configName = "";Y7C北方站长站
 private boolean b_isFromResource = true;Y7C北方站长站
 public static Object getInstance(String sConfigName,Y7C北方站长站
 Boolean bIsFromResource){Y7C北方站长站
  synchronized(pLock){Y7C北方站长站
   if(null == p_instance){Y7C北方站长站
    p_instance =new myTestClass(sConfigName,bIsFromResource);Y7C北方站长站
   }Y7C北方站长站
  }Y7C北方站长站
  return p_instance;Y7C北方站长站
 } Y7C北方站长站
 private myTestClass(String sConfigName,Boolean bIsFromResource){Y7C北方站长站
  s_configName = sConfigName;Y7C北方站长站
  b_isFromResource = bIsFromResource.booleanValue();Y7C北方站长站
 }Y7C北方站长站
 public void echoInfo(){Y7C北方站长站
  System.out.println("current arguments : configName=["+Y7C北方站长站
   s_configName+"],isFromResource=["+b_isFromResource+"]");Y7C北方站长站
 }Y7C北方站长站
 public static void main(String[] args) throws Exception{Y7C北方站长站
  // 设置方法的传入参数的类型. Y7C北方站长站
  Class[] parameterTypes = new Class[]{Y7C北方站长站
   java.lang.String.class,Y7C北方站长站
   java.lang.Boolean.classY7C北方站长站
  };Y7C北方站长站
  Method mGetInstance = null;Y7C北方站长站
  String className = "myTestClass";Y7C北方站长站
  Class curTestClass = Class.forName(className);Y7C北方站长站
  try{Y7C北方站长站
   mGetInstance = curTestClass.getMethod("getInstance",parameterTypes);Y7C北方站长站
  }Y7C北方站长站
  catch(NoSuchMethodException e){Y7C北方站长站
   e.printStackTrace();Y7C北方站长站
   mGetInstance = null;Y7C北方站长站
  }Y7C北方站长站
  if(mGetInstance != null){Y7C北方站长站
   myTestClass pObj = (myTestClass)Y7C北方站长站
    mGetInstance.invoke(null,new Object[]{Y7C北方站长站
     "src/myconfig.properties",Y7C北方站长站
     Boolean.FALSEY7C北方站长站
    }Y7C北方站长站
   );Y7C北方站长站
   pObj.echoInfo();Y7C北方站长站
  }Y7C北方站长站
  else{Y7C北方站长站
   throwY7C北方站长站
    new Exception("myTest Init Failed from class" +Y7C北方站长站
     className +Y7C北方站长站
     System.getProperty("line.seperator","/n") +Y7C北方站长站
     "method getInstance(String, Boolean) exists.");Y7C北方站长站
  }Y7C北方站长站
 }Y7C北方站长站
}
Y7C北方站长站

 

News

 

info

 

down

出售手机裁听器,手机跟踪定位系统    企业网站,网城,购物网,都市导购,校园网    网上书店系统    上海电信机房服务器托管,双线主机托管    美女图片馆    15G 高清晰图片资源 无水印    室内装潢材料新产品杰威尔艺术漆    收一万ip的美女图片    大量收购个人网址导航网站    出售网址站PR=4alexa=119,764    

下一篇链接:Web框架比较:Struts、Spring MVC、WebWork、Tapestry和JSF(by Matt Raible)

上一篇链接:Liferay中整合tinyMCE详解

评论】 【打印】 【加入收藏】 【关闭→论坛 →博客 →数据中心

 共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面