java classloader

classloader 是负责载入类的对象。给出一个二进制的name,classloader就会根据name生产或载入组成一个类结构的数据。一种常见的策略是,把name转译成一个文件的名字,然后通过文件系统去读取这个类文件。

每个class 对象有一个getClassloader文法获得载入自己的class loader。数组对象不会由class loader载入,它会在运行时自动载入。对于数组元素是基本类型的,通过getClassloader返回的是null,其它自定义类型返回的时自定义对象的classloader

classloader使用委托模式搜索classes 和 resources。当需要调用一个class或resource时,class loader会首先靠自己去搜索它,如果没有找到,会在委托父class loader搜索。jvm 内建的class loader叫bootstrap class loader,它没有父class loader,它作为其它class loader的父class loader

测试:

package com.peaceful.jdk.demo;

import com.peaceful.common.util.Util;

import sun.reflect.Reflection;

import java.lang.ClassLoader;

/**

* Created by wangjun on 15/2/21.

*/

public class ClassLoaderTest {

public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {

Util.report(Reflection.getCallerClass());

/** 载入ClassLoaderTest的classloader **/

Util.report("载入ClassLoaderTest的classloader->" + ClassLoaderTest.class.getClassLoader());

/** appache 提供的classloader */

com.sun.org.apache.bcel.internal.util.ClassLoader classLoader = new com.sun.org.apache.bcel.internal.util.ClassLoader(java.lang.ClassLoader.getSystemClassLoader());

Util.report("appache 提供的classloader->" + classLoader);

Class ClassLoaderTestClass = Class.forName("com.peaceful.jdk.demo.ClassLoaderTest", false, classLoader);

Util.report("classloader ? ->" + ClassLoaderTestClass.getClassLoader());

Util.report("apache class loader parent ->" + ClassLoaderTestClass.getClassLoader().getParent());

/** java.lang.ClassCastException: com.peaceful.jdk.demo.ClassLoaderTest cannot be cast to com.peaceful.jdk.demo.ClassLoaderTest **/

//        ClassLoaderTest ClassLoaderTest = (ClassLoaderTest) ClassLoaderTestClass.newInstance();

/** 不同的classload 载入同一个类不能进行比较和转换 */

Util.report("? ->" + ClassLoaderTestClass.isInstance(ClassLoaderTest.class));

/** 通过指定classloader 载入指定类 **/

classLoader.loadClass("com.peaceful.jdk.demo.ClassLoaderTest");

/** 系统启动时设定的classloader **/

Util.report(ClassLoader.getSystemClassLoader());

int[] arr = {1, 2, 3, 4, 5};

ClassLoaderTest[] arrClassLoaderTest = {};

/**<p> <tt>Class</tt> 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 {@link

* 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.

* */

Util.report(arr.getClass().getClassLoader());

Util.report(arrClassLoaderTest.getClass().getClassLoader());

/** 父classloader **/

Util.report(ClassLoaderTest.class.getClassLoader().getParent());

/** 父classloader的classloader **/

Util.report(ClassLoaderTest.class.getClassLoader().getParent().getParent());

Util.report(T2.class.getClassLoader());

Util.report(System.currentTimeMillis());

Util.report(System.nanoTime());

}

/**

* 输出结果

*

P_LOG: class com.intellij.rt.execution.application.AppMain

P_LOG: 载入ClassLoaderTest的classloader->[email protected]

P_LOG: appache 提供的classloader->[email protected]

P_LOG: classloader ? ->[email protected]

P_LOG: apache class loader parent ->[email protected]

P_LOG: ? ->false

P_LOG: [email protected]

P_LOG: null

P_LOG: [email protected]

P_LOG: [email protected]

P_LOG: null

P_LOG: [email protected]

P_LOG: 1424681861529

P_LOG: 1424681861530021000

*

*/

class T2 {

}

}

时间: 2024-08-28 20:15:54

java classloader的相关文章

理解Java ClassLoader机制(转载)

当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构: bootstrap classloader                |       extension classloader                |       system classloader bootstrap classloader -引导(也称为原始)类加载器,它负责加载Java的核心类. 在Sun的JVM中,在执行java的命令中使用-Xbootclasspath选项或使用 - D

java classLoader体系结构使用详解

原创整理不易,转载请注明出处:java classLoader体系结构使用详解 代码下载地址:http://www.zuidaima.com/share/1774052029516800.htm jvm classLoader architecture: Bootstrap ClassLoader/启动类加载器 主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作. Extension ClassLoader/扩展类加载器  主要负

[转载] 深入了解Java ClassLoader、Bytecode 、ASM、cglib

转载自http://www.iteye.com/topic/98178 一.Java ClassLoader 1,什么是ClassLoader 与 C 或 C++ 编写的程序不同,Java 程序并不是一个可执行文件,而是由许多独立的类文件组成,每一个文件对应于一个 Java 类. 此外,这些类文件并非立即全部都装入内存,而是根据程序需要装入内存.ClassLoader 是 JVM 中将类装入内存的那部分. 而且,Java ClassLoader 就是用 Java 语言编写的.这意味着创建您自己的

(转)Java ClassLoader详解

转:http://java.chinaitlab.com/base/804400.html 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的.Java Applet 需要从远程下载 Java 类文件到浏览器中并执行.现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用.一般来说,Java 应用的开发人

转 Java Classloader机制解析

转 Java Classloader机制解析 发表于11个月前(2014-05-09 11:36)   阅读(693) | 评论(0) 9人收藏此文章, 我要收藏 赞1 慕课网,程序员升职加薪神器,点击免费学习 目录[-] JDK默认ClassLoader 双亲委托模型 如何自定义ClassLoader 1.loadClass 方法 2.findClass 3.defineClass 不遵循“双亲委托机制”的场景 做Java开发,对于ClassLoader的机制是必须要熟悉的基础知识,本文针对J

java classloader原理深究

java classloader原理深究 前面已经写过一篇关于java classloader的拙文java classloader原理初探. 时隔几年,再看一遍,觉得有些地方显得太过苍白,于是再来一篇: 完成一个Java类之后,经过javac编译,会生成一个class文件,这个class文件中包含跟这个类相关的所有基本信息:属性字段,方法等.这些都属于一个类的元数据,是不变的部分.在执行过程,则需要根据类的元数据信息生成一个实例对象,这个实例对象可以根据不同场景拥有不同状态.也就是说同一个cl

java classLoader机制解析

类从被加载到虚拟机内存中开始,到卸装出内存为止,它的整个生命周期包括了:加载,连接(验证,准备,解析),初始化,使用和卸载七个阶段.其中验证.准备和解析三个部分称为连接,也就是说,一个Java类从字节代码到能够在JVM中被使用,需要经过加载.链接和初始化这三个步骤 .我们看一看Java虚拟机的体系结构. Java虚拟机的体系结构如下图所示: Java类加载的全过程,是加载.验证.准备.解析和初始化这五个阶段的过程.而加载阶段是类加载过程的一个阶段.在加载阶段,虚拟机需要完成以下三件事情: 通过一

Java ClassLoader加载机制理解 实际例子

针对 Java ClassLoader加载机制理解, 做了个如何自定制简单的ClassLoader,并成功加载指定的类. 不废话,直接上代码. package com.chq.study.cl; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOExcept

Java ClassLoader 基础

基本概念: Java Classloader(类装载器):JRE的一个模块,用于装载Java类到JVM. JRE加载一个类到JVM需要以下基本步骤: 装载:查找并导入class文件,如String.class: 链接:校验.准备.解析,其中解析步骤是可以选择的,由使用目的决定: 校验:检查载入class文件数据的正确性,因为某些class文件可能是利用工具生成,而非使用Java编译器编译生成: 准备:给类的静态成员分配存储空间: 解析:将符号引用转成直接引用: 初始化:对类的静态成员.静态代码块

Java ClassLoader 原理详细分析

一.什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都被封装在不同的class文件当中,所以经常要从这个class文件中要调用另外一个class文件中的方法,如果另外一个文件不存在的,则会引发系统异常.而程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的