2006-05-25日 反射在构造函数上的应用

1.   研究一下如下方法    class.forName().newInstance()

如果我需要写一个需要操作数据库的操作,然而各家公司所用的数据库不一样,有用oracle,DB2或者mysql,那怎么样做才能做到更改方便,适应能力强的程序呢?

我们可以把数据库需要加载的类通过properties文件指明,然后提供一个facade类,其实也就是一个接口,它有加载数据库的通用方法,然后用reflection机制的classforName和newInstance方法来动态加载,呵呵,这里似乎也借鉴了spring通过xml文件来做反转控制的理念

public class MainApplication {
//...
private Properties props;
private CustomerDatabase custDB;
//...
public synchronized CustomerDatabase createDBFacade() {
if ( custDB == null ) {
try {
String dbClassName
= props.getProperty( "db.class",
"com.wci.app.StubCustomerDB");
Class cls = Class.forName(dbClassName);
custDB = (CustomerDatabase) cls.newInstance();
}
catch (ClassNotFoundException ex) {
// ...
}
catch (InstantiationException ex) {
// ...
}
catch (IllegalAccessException ex) {
// ...
}
}
return custDB;
}
}

这里要说明的是class对象的newInstance等同于用没有参数的构造函数去实例化一个对象,简单吧,呵呵

 

2.嗯,还有别的要注意的 Construct类

还是看看我写的一个测试类吧,这里有1.和2的例子

import java.lang.reflect.*;
public class NewInstanceEqualsNoArgumentConstruction
{
 private int var1;
 private int var2;
 public NewInstanceEqualsNoArgumentConstruction()
 {
 }
 public NewInstanceEqualsNoArgumentConstruction(int a,int b)
 {
  var1=a;
  var2=b;
 }
 public void setVar1(int c)
 {
  var1=c;
 }
 public void setVar2(int c)
 {
  var2=c;
 }
 public int sum()
 {
  return var1+var2;
 }
 public static void greeting()
 {
  System.out.println("这个是没有实例化情况下用class来做到的问号语言,有意思吧,呵呵");
 }
 public static void main(String[] args)
 {   try
  {
  
   /
      Class c=NewInstanceEqualsNoArgumentConstruction.class;
     Constructor ct=c.getConstructor(new Class[]{int.class,int.class});

   NewInstanceEqualsNoArgumentConstruction m=(NewInstanceEqualsNoArgumentConstruction)ct.newInstance(3,4);
   NewInstanceEqualsNoArgumentConstruction n=(NewInstanceEqualsNoArgumentConstruction)c.newInstance();
   //
   n.setVar1(1);
   n.setVar2(2);
   System.out.println("和是: "+n.sum());
   System.out.println("有参数的构造函数得到的和是: "+m.sum());
  }
  
  catch(InstantiationException e)
  {
   e.printStackTrace();
  }
  
  catch(IllegalAccessException e)
  {
   e.printStackTrace();
  }
  
  catch(SecurityException e)
  {
   e.printStackTrace();
  }
  
  catch(NoSuchMethodException e)
  {
   e.printStackTrace();
  }
  
  catch(Exception e)
  {
   e.printStackTrace();
  }

 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值