|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
还是要自己一点一点写代码,然后编译,改错再编译好那。还有最重要的是.net的编译环境非常好,你甚是不需要了解太多工具,对于简单的系统,你可以之了解一些语法就哦了。成绩
成绩形貌:程序代码中,实行以下语句:ObjectmapperObj=Class.forName(mapperClassName).newInstance();MapperInterfacemapper=(MapperInterface)mapperObj;报ClassCastException。
bugfix:1.分离获得运转情况下mapperObj和MapperInerface.class的classloader:mapperObj.getClass().getClassLoader():sun.misc.Launcher$AppClassLoaderMapperInterface.class.getClass().getClassLoader():WebContainerClassLoader2.由jvmclassload机制可知,jvmloadclass分四个条理:第一层为bootstrapclassloader:次要卖力loadrt.jar等jvm必需的jar包中的类。第二层为extclassloader:次要卖力load被置于java.ext.dirs属性值所指路径(默许%JAVA_HOME%/lib/ext)中一切的class.实在现类为sun.misc.Launcher$ExtClassLoader第三层为systemclassloader:卖力load被置于CLASSPATH路径中的类。实在现类通常是sun.misc.Launcher$AppClassLoader第四层为appclassloader:由使用程序计划者承继ClassLoader并完成完成响应user-definedClassLoader。用于依据使用程序必要加载并非计划时就晓得的类。
具体的load战略偶就未几写了,良多文章上都有,总之两句话:当define一个类的时分,低层classloader会向下层扣问是不是已define,有则间接拿来用;当load一个类的时分,一样低层向高层扣问是不是能find到,能就间接拿来用。
由此可知,因为原有体系缘故原由,mapperObj被systemclassloaderdefine;而这里利用的接口是被appclassloaderWebContainerClassLoaderdefine的。以是会形成ClassCastException毛病。用instanceof也可发明mapperObj的确不是MapperInterface的实例。
因为原体系缘故原由,没法经由过程修改其他代码完成改换mapperObjclassload的举措,而运转到以后代码时,mapperObj已被define,以是没法经由过程forName办法的参数变动其classloader,前面的代码就没法挪用其办法。
办理办法:接纳类反射,换有Object界说的属性接mapperObj;鄙人面的代码中,使用mapperObj.getClass().getInterface()办法判别是不是其承继了MapperInterface。然后用反射挪用其办法。例:
mapper=Class.forName(mapperClassName).newInstance();
Class[]tmpInterface=mapper.getClass().getInterfaces();for(inti=0;i<tmpInterface.length;i++){if(tmpInterface[i].getName().equals("MapperInterface.class.getName()"))flag=true;}
if(flag){Class[]tc=newClass[2];tc[0]=String.class;tc[1]=HttpServletRequest.class;MethodmapperFunc=mapper.getClass().getMethod("mapFunction",tc);Objectres=mapperFunc.invoke(mapper,newObject[]{event.getServletClassName(),req});}
再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。 |
|