JBoss JMX实现架构.doc
《JBoss JMX实现架构.doc》由会员分享,可在线阅读,更多相关《JBoss JMX实现架构.doc(46页珍藏版)》请在沃文网上搜索。
1、第2章 JBoss JMX微内核(Microkernel)2.2 JBoss JMX实现架构2.2.1 JBoss类装载器架构JBoss 3.x实现了一种新的类装载架构,即允许类跨部署单元使用。在JBoss 2.x中,很难实现MBean服务和动态部署的J2EE组件进行交互,并且MBean本身不具有热部署能力。在JBoss 3.x中,任何东西都是热部署的,因为新的部署架构和类装载架构使得它们成为可能。本文在深入讨论具体的JBoss类装载模型之前,将给出Java的类型系统特性及类装载器介绍。2.2.2 类装载和Java中的类型类装载是所有服务器架构的基础组成部分。具体服务及其支持服务的类必须装载到
2、服务器框架中。Java的强类型化(typed)特性使得类装载易于出现问题。大部分开发者知道,Java中类的类型是由类的全限定(fully qualified)名决定的。从Java 1.2开始,用于定义类的java.lang.ClassLoader也能够决定类的类型。这样做的理由在于确保从特定位置装载类的环境是类型安全的(type-safe)。Vijay Saraswat于1997年发表的论文“Java is not type-safe 译者注:论文全文请参考”证明了Java不是类型安全的。这使得应用能够使用先前装载的其他类实现版本而愚弄JVM,从而访问到Java不应该访问的类方法和成员。这种对
3、类型系统的欺骗的根源在于这些应用引入了那些能够跨越正常委派模型的类装载器。类装载器使用委派模型搜索类和资源。在通常情况下,类装载器实例都有与之关联的双亲类装载器,它可能是在创建类装载器时显式设置的;如果没有给出双亲类装载器,则由JVM指定。如果需要寻找类或资源,则在类装载器自身去寻找它们之前,通常情况下都会将该搜索工作委派给其双亲类装载器。JVM有根类装载器,称为引导(bootstrap)类装载器。引导类装载器没有双亲类装载器,但能够成为其他类装载器实例的双亲。为了解决类型安全问题,Java类型系统除了通过类名完整地定义类型外,还引入了用于定义类的类装载器。其内容请参考由Sheng Liang
4、和Gilad Bracha完成的论文Dynamic Class Loading in the Java Virtual Machine。同时,通过Web地址 papers/oopsla98.ps.gz,开发者能够获得其原文。另外,在动态环境中,比如应用服务器(尤其是支持热部署的JBoss),动态类装载方式有了更深入的发展。其中,ClassCastException、LinkageError及IllegalAccessError更能展示出静态类装载上下文中所看不到的场景。本文接下来仔细研究上述各种异常的具体含义和发生方式。1ClassCastException我不是你的类型无论在什么情况下,只要
5、将实例造型(cast)作为其不兼容的类型,系统就会抛出java.lang.ClassCastException异常。比如,某简单实例如下:将.URL放入java.util.ArrayList后,试图获得java.lang.String的代码和异常信息如下:ArrayList array = new ArrayList();array.add(new URL(file:/tmp);String url = (String) array.get(0);java.lang.ClassCastException: .URLat org.jboss.chap2.ex0.ExCCEa.main(Ex1CC
6、E.java:16)开发者可以从ClassCastException看出,将array元素造型作为String类型失败,因为该元素的实际类型为.URL。当然,开发者对这种试验性的场景不会感兴趣。让我们考虑另一种场景:不同的URLClassLoader装载了相同的jar文件。从字节码角度考虑,尽管通过不同URLClassLoader装载的类是完全相同的,但它们被Java类型系统看做完全不同的类型。列表2-1、列表2-2和列表2-3给出了相应的代码实例。列表2-1 用于证明由于不同类装载器而触发ClassCastException的ExCCEc类1 package org.jboss.chap2.
7、ex0;23 import java.io.File;4 import .URL;5 import .URLClassLoader;6 import java.lang.reflect.Method;78 import org.apache.log4j.Logger;910 import org.jboss.util.ChapterExRepository;11 import org.jboss.util.Debug;1213 /* An example of a ClassCastException that results from classes loaded through14 * d
8、ifferent class loaders.15 * author Scott.Starkjboss.org16 * version $Revision:$17 */18 public class ExCCEc19 20 public static void main(String args) throws Exception21 22 ChapterExRepository.init(ExCCEc.class);2324 String chapDir = System.getProperty(chapter.dir);25 Logger ucl0Log = Logger.getLogger
9、(UCL0);26 File jar0 = new File(chapDir+/j0.jar);27 ucl0Log.info(jar0 path: +jar0.toString();28 URL cp0 = jar0.toURL();29 URLClassLoader ucl0 = new URLClassLoader(cp0);30 Thread.currentThread().setContextClassLoader(ucl0);31 Class objClass = ucl0.loadClass(org.jboss.chap2.ex0.ExObj);32 StringBuffer b
10、uffer = new StringBuffer(ExObj Info);33 Debug.displayClassInfo(objClass, buffer, false);34 ucl0Log.info(buffer.toString();35 Object value = objClass.newInstance();3637 File jar1 = new File(chapDir+/j0.jar);38 Logger ucl1Log = Logger.getLogger(UCL1);39 ucl1Log.info(jar1 path: +jar1.toString();40 URL
11、cp1 = jar1.toURL();41 URLClassLoader ucl1 = new URLClassLoader(cp1);42 Thread.currentThread().setContextClassLoader(ucl1);43 Class ctxClass2 = ucl1.loadClass(org.jboss.chap2.ex0.ExCtx);44 buffer.setLength(0);45 buffer.append(ExCtx Info);46 Debug.displayClassInfo(ctxClass2, buffer, false);47 ucl1Log.
12、info(buffer.toString();48 Object ctx2 = ctxClass2.newInstance();4950 try51 52 Class types = Object.class;53 Method useValue = ctxClass2.getMethod(useValue, types);54 Object margs = value;55 useValue.invoke(ctx2, margs);56 57 catch(Exception e)58 59 ucl1Log.error(Failed to invoke ExCtx.useValue, e);6
13、0 throw e;61 62 63 列表2-2 实例使用到的ExCtx类64 package org.jboss.chap2.ex0;6566 import java.io.IOException;6768 import org.apache.log4j.Logger;6970 import org.jboss.util.Debug;7172 /* A classes used to demonstrate various class loading issues73 * author Scott.Starkjboss.org74 * version $Revision: 1.2 $75 *
14、/76 public class ExCtx77 78 ExObj value;7980 public ExCtx() throws IOException81 82 value = new ExObj();83 Logger log = Logger.getLogger(ExCtx.class);84 StringBuffer buffer = new StringBuffer(ctor.ExObj);85 Debug.displayClassInfo(value.getClass(), buffer, false);86 log.info(buffer.toString();87 ExOb
15、j2 obj2 = value.ivar;88 buffer.setLength(0);89 buffer = new StringBuffer(ctor.ExObj.ivar);90 Debug.displayClassInfo(obj2.getClass(), buffer, false);91 log.info(buffer.toString();92 93 public Object getValue()94 95 return value;96 97 public void useValue(Object obj) throws Exception98 99 Logger log =
16、 Logger.getLogger(ExCtx.class);100 StringBuffer buffer = new StringBuffer(useValue2.arg class);101 Debug.displayClassInfo(obj.getClass(), buffer, false);102 log.info(buffer.toString();103 buffer.setLength(0);104 buffer.append(useValue2.ExObj class);105 Debug.displayClassInfo(ExObj.class, buffer, fal
17、se);106 log.info(buffer.toString();107 ExObj ex = (ExObj) obj;108 109 void pkgUseValue(Object obj) throws Exception110 111 Logger log = Logger.getLogger(ExCtx.class);112 log.info(In pkgUseValue);113 114 115列表2-3 实例使用到的ExObj和ExObj2类package org.jboss.chap2.ex0;import java.io.Serializable;/* author Sco
18、tt.Starkjboss.org* version $Revision:$*/public class ExObj implements Serializablepublic ExObj2 ivar = new ExObj2();-package org.jboss.chap2.ex0;import java.io.Serializable;/* author Scott.Starkjboss.org* version $Revision: 1.1$*/public class ExObj2 implements SerializableExCCEc.main方法使用反射将应用程序的类装载器
19、与URLClassLoader ucl0和ucl1各自装载的类隔离开,而这些类都是从output/chap2/j0.jar文件中装载的。j0.jar的具体内容如下:nrtoki examples$ jar -tf output/chap2/j0.jar.org/jboss/chap2/ex0/ExCtx.classorg/jboss/chap2/ex0/ExObj.classorg/jboss/chap2/ex0/ExObj2.class本文将通过运行实例来证明ClassCastException是如何出现的,然后再来研究问题所在。请参考附录C提供的本书附带实例的安装指南。从光盘目录使用如下命
20、令运行该实例:nrtoki examples$ ant -Dchap=chap2 -Dex=0c run-exampleBuildfile: build.xml. java ERROR,UCL1 Failed to invoke ExCtx.useValue java java.lang.reflect.InvocationTargetException java at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) java at sun.reflect.NativeMethodAccessorImpl.invoke(N
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
10 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JBoss JMX实现架构 JMX 实现 架构