|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
一旦你有了思想,那你编的程序就有了灵魂,不管是什么语言到了你的手里都会是你的工具而已,他们的价值是能尽快帮助你实现你想要的目标。但是如果你没有了思想,那就像是海里的帆船失去了船帆,是很难到打海的另一边的。
在Java中,经由过程Class.forName()办法能够静态决意加载哪个类,这个功效关于不异接口的分歧完成来说十分有效。好比关于计划好的数据库毗连池接口,我们能够有多种的接话柄现类来完成不异的功效,同时用户能够复杂的经由过程修正设置文件来指定实践利用哪个完成类,在源代码内里经由过程读取设置文件信息,并用Class.forName(configClassName).getInstance()就能够机关一个特定的完成类实例,而不必每次修正源代码。如许关于程序来说只用体贴接口的界说,用户只用举行设置文件的设置就完成了统一功效的分歧完成的切换。
可是假如完成类必要经由过程静态办法来举行初始化的时分,静态加载的历程就会庞大一些。一样的以数据库毗连池为例,一般毗连池的机关函数城市被界说为公有的,而经由过程自界说的getInstance()静态办法来失掉独一实例。这类情形下复杂的经由过程Class.forName().getInstance()就没法准确机关实例。
幸亏Java所供应的反射机制(Reflection)为我们供应了完全了探悉类外部布局的办法。经由过程反射机制,我们可以完成基础上一切的运转时决意的举措(固然这一完成要比其他静态言语,好比PHP,的eval()的利用要庞大的多)。
上面经由过程实践的例子申明怎样在运转时静态会见类的静态办法。
-------------------------------------------------------
*/
importjava.lang.reflect.*;
publicclassmyTestClass{
privatestaticObjectpLock=newObject();
privatestaticmyTestClassp_instance=null;
privateStrings_configName="";
privatebooleanb_isFromResource=true;
publicstaticObjectgetInstance(StringsConfigName,
BooleanbIsFromResource){
synchronized(pLock){
if(null==p_instance){
p_instance=newmyTestClass(sConfigName,bIsFromResource);
}
}
returnp_instance;
}
privatemyTestClass(StringsConfigName,BooleanbIsFromResource){
s_configName=sConfigName;
b_isFromResource=bIsFromResource.booleanValue();
}
publicvoidechoInfo(){
System.out.println("currentarguments:configName=["+
s_configName+"],isFromResource=["+b_isFromResource+"]");
}
publicstaticvoidmain(String[]args)throwsException{
//设置办法的传进参数的范例.
Class[]parameterTypes=newClass[]{
java.lang.String.class,
java.lang.Boolean.class
};
MethodmGetInstance=null;
StringclassName="myTestClass";
ClasscurTestClass=Class.forName(className);
try{
mGetInstance=curTestClass.getMethod("getInstance",parameterTypes);
}
catch(NoSuchMethodExceptione){
e.printStackTrace();
mGetInstance=null;
}
if(mGetInstance!=null){
myTestClasspObj=(myTestClass)
mGetInstance.invoke(null,newObject[]{
"src/myconfig.properties",
Boolean.FALSE
}
);
pObj.echoInfo();
}
else{
throw
newException("myTestInitFailedfromclass"+
className+
System.getProperty("line.seperator","
")+
"methodgetInstance(String,Boolean)exists.");
}
}
}
比如模式、敏捷方法什么的,这些思想好,但是实施的人没有理解而且没有正确运用这些知识导致了开发周期的延长。比如说对象,通过getName()方法不能获取对象的名字。 |
|