在Java中动态实施类的静态办法[Java编程]
本文“在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;
}
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","
") +
"method getInstance(String, Boolean) exists.");
}
}
}
以上是“在Java中动态实施类的静态办法[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |