JAVA网站制作之关于分歧级别classloader define的类的...
还是要自己一点一点写代码,然后编译,改错再编译好那。还有最重要的是.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.getName().equals("MapperInterface.class.getName()"))flag=true;}
if(flag){Class[]tc=newClass;tc=String.class;tc=HttpServletRequest.class;MethodmapperFunc=mapper.getClass().getMethod("mapFunction",tc);Objectres=mapperFunc.invoke(mapper,newObject[]{event.getServletClassName(),req});}
再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
页:
[1]