Java编程极限考验:ClassLoader类装载策略
作者:banq
发表时间:2004年07月26日
转自 http://www.jdon.com/jivejdon/thread/15456.html
<!-- advert -->
个人认为,Java编程中极限考验是Classloader机制的掌握和灵活运用,特别是在复杂的系统,如存在动态类装载,Reflect,EJB,AOP等环境。
CLass.forName()
和Thread.currentThread().getContextClassLoader())
是否一样?
在很多文章中,都认为两者是一致的,如Java研究组织中一篇文章,被我从google搜索到的:
http://www.javaresearch.org/article/showarticle.jsp?column=31&thread=10178
文中说"这个方法可以用Class.forName()代替",在一般简单情况是可以替代,但实际上有时候是不能替代的。
Classloader存在下面问题:
在
一个JVM中可能存在多个ClassLoader,每个ClassLoader拥有自己的NameSpace。一个ClassLoader只能拥有一个
class对象类型的实例,但是不同的ClassLoader可能拥有相同的class对象实例,这时可能产生致命的问题。如ClassLoaderA,
装载了类A的类型实例A1,而ClassLoaderB,也装载了类A的对象实例A2。逻辑上讲A1=A2,但是由于A1和A2来自于不同的
ClassLoader,它们实际上是完全不同的,如果A中定义了一个静态变量c,则c在不同的ClassLoader中的值是不同的。
因此,研究JBoss的ClassLoader策略,对于更好地实现EJB
组件拼装是用好处的,因为,一个项目中可能要用其他项目的EJB
组件,如何实现运行时EJB
组件共享,如何实现EJB
组件打包是很重要的。
为了说明ClassLoader对于复杂架构是至重关键,列举开源Portal产品Exo中ServivesManager类内容。
该类是Exo利用PicoCOntainer实现功能性Service JavaBeans初始化,在将那些Service性质的JavaBeans加载到pico中时,需要使用到Classloader,
Exo专门设立一个ServiceContext类:
public
class
ServiceContext {
private
ClassLoader cl; //包含Classloader信息
private
Services services;
public
ServiceContext(ClassLoader cl, Services services) {
this
.cl = cl;
this
.services = services;
}
public
ClassLoader getCl() {
return
cl;
}
public
Services getServices() {
return
services;
}
}
在ServicesManager中,有:
private ClassLoader updatedClassLoader;
它的初始值是:
Thread.currentThread().getContextClassLoader();
如果,这里写Class.forName 那么简单,那么你头疼去吧。
但是这样不够:
在addService方法中,根据加入的不同ServiceContext实现类装载:
public
void
addService(ServiceContext context) {
Services servicesToAdd = context.getServices();
String name = servicesToAdd.getName();
URLClassLoader cl = null
;
if
(context.getCl() instanceof URLClassLoader) {
cl = (URLClassLoader) context.getCl();
} else
{
cl = URLClassLoader.new
Instance(new
URL[]{}, context.getCl());
}
updatedClassLoader = new
URLClassLoader(cl.getURLs(), updatedClassLoader);
synchronized
(servicesContext) {
servicesContext.put(name, context);
reloadContainer();
}
}
其
实向Picocontainer中加入一个服务很简单,上述方法的主要代码是处理Classloader,考虑到Classloader有嵌套关系,上述
代码小心使用这个Service服务的父Classloader,使用父Classloader装载服务Service。
分享到:
相关推荐
NULL 博文链接:https://wuaner.iteye.com/blog/1011036
661.659.JAVA基础教程_动态代理与Java8新特性-复习:ClassLoader(661).rar
NULL 博文链接:https://davyjones2010.iteye.com/blog/2222811
类的动态装载机制是JVM的一...本文介绍了JVM中类装载的原理、实现以及应用,尤其分析了ClassLoader的结构、用途以及如何利用自定义 的ClassLoader装载并执行Java类,希望能使读者对JVM中的类装载有一个比较深入的理解。
破解java加密的ClassLoader.java,在classloader植入破解代码
内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:
java应用程序类加载器(ClassLoader for java Application),类似exe4j, 方便启动java程序, 配置灵活,支持多平台选择性配置
答:Java是一种面向对象的编程语言,由Sun Microsystems公司(现属Oracle公司)于1995年推出。它具有简单、对象 oriented、分布式、多线程、动态、 Architecture neutral、高度可移植、安全等特点。 2. 什么是JVM? 答...
Java中ClassLoader的解析,从ClassLoader的角度分析了JVM,装载类,创建类的对象的整个过程,更清晰的了解JVM的运行机制。
ClassLoader动态加载类 简单示例 包装tank.test; 导入java.util.Scanner; 导入tank.classloader.ClassLoaderManager; 导入tank.classloader.MyClassLoaderManager; 导入tank.classloader.SystemClassLoaderManager...
Java ClassLoader定制实例
类装载器ClassLoader1
ClassLoader类加载器讲解,理解JAVA类加载机制
java classloader classpath 张孝祥
java自定义类加载classloader文档,包括代码,以及详细的原理及过程
Java的类加载机制:加载,连接,初始化。JAVA类加载器: Bootstrap ClassLoader : 根类加载器, Extension ClassLoader: 扩展类加载器, System ClassLoader : 系统类加载器, Java反射
如果户创建的JAR放在此录下,也会动由扩展类加载器加载.应程序类加载器(系统类加载器,Application ClassLoader)java语编写,由sun.
java源码源码类加载器泄漏预防库 如果您想避免可怕的java.lang.OutOfMemoryError: Metaspace / PermGen space ,只需将此库包含到您的 Java EE 应用程序中,它就会处理剩下的事情! 要了解有关类加载器泄漏、其原因...