classLoader

转载 2006年05月29日 22:12:00

众所周知,Java 2之后在ClassLoader中使用了parent-Delegation模式,目的是为了简化User-defined ClassLoader的实现和更好的安全性。
ClassLoader通常作为Java 安全性的第一道屏障,


  1. 它会阻止恶意代码对原有可信任代码的干扰。
  2. 保护可信任代码。
  3. 将不同的代码分类(称之为protection domains 或 runtime domain)。


1. ClassLoader会在运行时将每一个加载过的class分配到一个唯一命名空间([i]name-space[/i])之下。不同的class根据加载的class loader的不同,被分配到不同的name-space。JVM会为每一个class loader维护一个唯一的name-space名称。一旦一个class A 已经被加载并且被安置在name-space N下,就不可能在加载另一个A 在同一个name-space下。

2. Java语言中的包访问成员(friendly)实际上指的是运行时包访问可见,而不是编译时。因此当你试图访问不在同一个runtime package的成员是(即便在编译时它们在同一个包内,但是却由不同的class loader加载)也同样会得到java.lang.IllegalAccessException: Class A can not access a member of class B with modifiers "" 这样的异常。

 

3.一个User-defined必须依赖其他的Class loader,至少需要system class loader,来协助它完成对某些class的加载工作。在1.2之后,每一个class loader除了bootstrap class loader都有一个parent class loader。每一次需要加载class时,首先会去请求parent class loader来加载这个class,如果不成功才会自己进行加载工作。这称为parent-delegation model。
如果你违反了这一协定的话,通常你会得到一个NoClassDefFoundError因为你的class Loader无法找到一些Java API中的类 ,比如说java.lang.Object。
你可能想如果将这些Java API中的类也放在你的class loader的路径下,是否就可以了呢?JVM不会允许你这样做的。你会得到:java.lang.SecurityException: Prohibited package name: java.lang,这样的异常。在Java 1.2之后,所有的java core api都由一个JVM内置的class loader加载,并且java 安全机制不允许这些类或接口被除此之外的class loader加载。

4.在一个缺省的JVM环境下,通常存在两个Class Loader。一个就是所谓的bootstrap class loader,它用来加载所有的java core api(包括所有java包下的类),另一个是系统class loader,它用来加载你定义的class_path下的类。
通常使用Class.getClassLoader()方法可以查询到加载这个class的class loader的信息。但是对于sun 的 jvm 实现而言,对于core api的class这样做只会得到null。(见 java doc)。
Ps: 系统class loader为sun.misc.Launcher$AppClassLoader。

 

5. Class objects for array classes are not created by class loaders, but are created automatically as required by the Java runtime. The class loader for an array class, as returned by Class.getClassLoader() is the same as the class loader for its element type; if the element type is a primitive type, then the array class has no class loader.

6.JVM在运行时会产生三个ClassLoader,Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader.其中,Bootstrap是用C++编写的,我们在Java中看不到它,是null。它用来加载核心类库,在JVM源代码中这样写道:
static const char classpathFormat[] =
"%/lib/rt.jar:"
"%/lib/i18n.jar:"
"%/lib/sunrsasign.jar:"
"%/lib/jsse.jar:"
"%/lib/jce.jar:"
"%/lib/charsets.jar:"
"%/classes";

7.

getClassLoader() on a Class instance. ClassLoader.getSystemClassLoader(). Thread.currentThread().getContextClassLoader().
    An application-specific method to retrieve a classloader. 

自定义ClassLoader,让spring加载外部的配置文件和类

今天同事遇到一个需求: 在外部以jar包的形式存放若干个插件,其中包含插件的类,以及spring配置文件;jar包不在classpath里 要实现这个需求,需要用到自定义的ClassLoader,...
  • kyfxbl
  • kyfxbl
  • 2013年09月24日 11:14
  • 3853

深入分析ClassLoader

why?ClassLoader,即java类加载器,主要作用是将class加载到JVM内,同时它还要考虑class由谁来加载。在说java的类加载机制之前,还是像前面的博客一样,先说说为什么要知道ja...
  • tonytfjing
  • tonytfjing
  • 2015年08月02日 22:52
  • 7679

java反射机制剖析(二)— Class Loader

上一篇博客简要的提了一下java反射机制中涉及到的一些相关知识,那么ClassLoader就是其中之一。本篇博客就详细的对ClassLoader做一个相对深入的了解。作为了解需要知道的是,其实类类型(...
  • zhuojiajin
  • zhuojiajin
  • 2014年08月31日 18:34
  • 3223

Android插件化学习之路(二)之ClassLoader完全解析

Java代码都是写在Class里面的,程序运行在虚拟机上时,虚拟机需要把需要的Class加载进来才能创建实例对象并工作,而完成这一个加载工作的角色就是ClassLoader。类加载器ClassLoad...
  • u012124438
  • u012124438
  • 2016年11月19日 22:53
  • 3027

ClassLoader 详解及用途(写的不错)

ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象。 1.1 几个相关概念Class...
  • lsm135
  • lsm135
  • 2016年08月06日 21:50
  • 574

一看你就懂,超详细java中的ClassLoader详解

ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。ClassLo...
  • briblue
  • briblue
  • 2017年02月10日 19:26
  • 39921

Tomcat源码分析之ClassLoader部分的设计详细分析

读Tomcat的源码也算是有一段时间了吧,感觉读的也是断断续续的,这次写一篇比较综合性的吧,来看看Tomcat的整体ClassLoader体系的设计。。。。 在具体的涉及到源码之前,先来一张图来整体的...
  • fjs_cloud
  • fjs_cloud
  • 2014年03月16日 19:35
  • 1870

java反射中,Class.forName和classloader的区别(代码说话)

java中class.forName()和classLoader都可用来对类进行加载。 class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的st...
  • qq_27093465
  • qq_27093465
  • 2016年08月20日 17:14
  • 15025

深入分析ClassLoader工作机制

ClassLoader 较为深入分析。from 加载CLASS到JVM中,审查每个类应该由谁加载,父优先的等级加载机制。加载机制ClassLoader类结构分析ClassLoader抽象类,有很多子类...
  • Newpidian
  • Newpidian
  • 2016年12月10日 00:26
  • 2697

深入浅出ClassLoader, 你真的了解ClassLoader吗?

http://ifeve.com/classloader/ Dedicate to Molly. 你真的了解ClassLoader吗? 这篇文章翻译自zeroturnar...
  • liangxw1
  • liangxw1
  • 2016年05月09日 15:49
  • 3653
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:classLoader
举报原因:
原因补充:

(最多只允许输入30个字)