JAVA基础:Java动态执行类的静态方法
在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;
}
JAVA基础:Java动态执行类的静态方法
</p> 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){
JAVA基础:Java动态执行类的静态方法
</p> 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.");
}
}
页:
[1]