网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  在java中动态执行类的静态方法     
  文章作者:未知  文章来源:水木森林  
  查看:81次  录入:管理员--2007-11-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 连接处于proxy(or 防火墙)之外的http服务器    下一篇: 使用hibernate扩展工具hbm2java根据配置文件生成持久化对象类(2.1.2)
  相关文档
java基础:垃圾收集器与java程序的性能 11-16
在java编程语言中实现udp协议编程的方法 03-31
关于java学习的一点感言 11-16
使用stopwatch类来计时 11-17
您的 利用 java 平台的特性建造一个令人瞩目的系统 11-17
java关于日期的运算等处理方法 11-17
sequenceinputstream使用一例 11-17
int 和 string 互相转换的多种方法 11-17
用java将大图片文件转换出小的缩略图文件 11-17
让 java me 程序实现真正run anywhere 11-16
什么是servlet以及servlet的优越性 11-16
用java编写简单的udp网络通信程序实例 11-16
java中几个重要的知识细节! 11-16
jml起步--使用jml改进你的java程序(4) 11-17
java手机软件图形界面api之form相关api 11-16
创建自己的违例 11-17
java对domino objects的访问控制 11-17
用factory method模式扩展mymsdntvlibrary 11-17
全面挖掘java excel api 使用方法(1) 11-17
pow 方法 11-16
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息