[/url]? Eclipse加载各个插件时,每个插件采用单独的线程,因此插件之间的同名对象是不同的,不能进行类型转换。这样的话,如果某些插件需要采用别的方式加载某些类库,将不能与Eclipse本身加载的类进行转换。此问题突出表现在J2EE客户端接口上。
? 为什么不同线程加载的同名类文件在JVM内部是不同的?请参考《深入Java虚拟机》一书,对其有比较详细的描述。
? 在eclipse中,不同的插件由eclipse生成一个线程,由此线程负责相应插件需要的类文件的加载。这样的好处是避免了不同插件之间可能存在的类文件的冲突(例如版本不一致引起的问题),但是也带来了不同的插件之间加载的类不同的问题(例如假设两个插件都加载了log4j,则两个插件之间的log4j对于JVM来说是两个不同的对象)。
? 在采用J2EE结构是,通常提供给J2EE客户端各种远程接口。通过JNDI查找远程Home接口,并进行强制类型转换。例如:
? ?ExampleHome home? =(ExampleHome)getContext().lookup(Example_JNDI_NAME);
注意,通过lookup查找来的对象是由sun.misc.Launcher加载的。但是在Eclipse插件中引用的ExampleHome是由eclipse本身加载的,所以上述转换在eclipse环境中将产生cast error.解决的办法就是让ExampleHome这些远程接口全部由sun.misc.Launcher加载,最简便的办法就是把这些包放入java系统路径下,作为系统组件由jvm加载。
? 类似的问题存在于eclipse环境中使用hibernate。hibernate在解析*.hbm.xml时会查找相应的类文件并进行加载。当hibernate本身作为插件插入到eclipse中时,那么*.hbm.xml对应的类文件必须放置到hibernate插件本身中去(可以通过库的方式加载),否则也会由于加载的线程不同造成类转换错误。
?
? 另外注意,eclipse的插件不允许循环引用。