关闭

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

标签: classproperties数据库constructorexceptionstring
984人阅读 评论(0) 收藏 举报
分类:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:152942次
    • 积分:2671
    • 等级:
    • 排名:第13578名
    • 原创:109篇
    • 转载:8篇
    • 译文:2篇
    • 评论:28条
    最新评论