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();
}
}
}