`
yimi128
  • 浏览: 56120 次
  • 来自: ...
社区版块
存档分类
最新评论

ClassLoader

    博客分类:
  • JAVA
 
阅读更多

 

一. 基本概念

 

    类加载器是用来把类 class 装载入 JVM

 

Java 运行时会产生三个 ClassLoader

 

Bootstrap ClassLoader(C++ 编写 )            用来加载核心类库,如 java.lang.*

ExtClassLoader                         用来加载 ext 目录下或者 ext.dir 指定的目录下的类库。

AppClassLoader                        用来加载 CLASSPATH 下的类库及类

 

    其中,ExtClassLoader和AppClassLoader也是由Bootstrap ClassLoader加载的。我们也可以继承ClassLoader,实现自己的ClassLoader

 

 

二. 双亲委托模型

 

    更好的保证 JAVA 平台的安全。在此模型下,当一个装载器被请求加载某个类时,先委托自己的 parent 去装载,如果 parent 能装载,则返回这个类对应的 Class 对象,否则,递归委托给父类的父类装载。

 

    在此模型下,用户自定义的类装载器,不可能装载应该由父亲装载的可靠类,从而防止不可靠甚至恶意的代码代替本应该由父亲装载器装载的可靠代码。

 

 

三. 命名空间

 

    假设我们有如下结构:

                       Loader1( 装载 Class1)

                                       

Loader2 ( 装载 Class2)

                                               

Loader3( 装载 Class3)             Loader4( 装载 Class4)

其中, Loader1 实际装载了 Class1 Loader 实际装载了 Class2 ,其余类似。

 

这里我们明确 2 个概念:

    定义类装载器 :实际装载类的类装载器。比如上例中的 Class1 的定义类装载器就是 Loader1 Class3 的定义类装载器就是 Loader3

    初始类装载器: 任何被要求装载某个类型,并且能够返回该类型的 Class 的类装载器,都称为改类型的初始类装载器。比如上例中, Class1 的初始装载器有 Loader3,Loader4,Loader2,Loader1   所以,从定义类装载器往下的所有子装载器,都是该类型的初始类装载器,包括定义类装载器。

 

   每个 ClassLoader 都有自己的命名空间,命名空间由所有以此装载器为初始类装载器的类组成,见下表:

类加载器

命名空间

Loader1

Class1

Loader2

Class1 Class2

Loader3

Class1 Class2 Class3

Loader4

Class1 Class2 Class4

 

        ClassLoader 在调用 loadClass 之前,总会先检查当前的命名空间(内部列表),如果 ClassLoader 是这个类型的初始类装载器,就会返回表示这个类型的 Class 实例。这样,虚拟机永远不会在同一个 ClassLoader 上装载同一个类型 2 次。

 

        不同命名空间的两个类是不可见的 (如,上例中的 Class3 Class4 ,但只要得到类所对应的Class对象的reference,还是可以访问另一命名空间的类。

 

 

 

四. 运行时包

 

    由同一个 ClassLoader 定义装载的属于相同包的类,组成了运行时包,决定两个类是不是属于同一个运行时包,不仅要看包名是否相同,还要看是否是由同一个 ClassLoader 加载的。 只有属于同一个运行时包的类才能互相访问包可见的类和成员。

 

      这样的限制避免了用户自己的代码冒充核心类库的类访问核心类库包可见成员的情况。假设用户自己定义了一个类 java.lang.xxx ,并用自定义的 ClassLoader 装载,由于 Java.lang.* java.lang.xxx 是由不同的装载器装载,属于不同的运行时包,所以 java.lang.xxx 不能访问核心类库 java.lang 中类的包可见成员。

 

综上,命名空间隔并不完全禁止属于不同空间的类的互相访问,而双亲委托加强了 Java 的安全,运行时包增加了对包可见成员的保护。

 

五. 实现自己的ClassLoader

 

我们也可以实现自己的ClassLoader,通过继承ClassLoader类,并重写findClass方法。例:

 

public class MyClassLoader extends ClassLoader {

	public Class findClass(String name) {
		byte[] data = loadClassData(name);
		return defineClass(name, data, 0, data.length);
	}

	public byte[] loadClassData(String name) {
		FileInputStream fis = null;
		byte[] data = null;
		try {
			fis = new FileInputStream(new File("E:/home/" + name.replace(".", "/") + ".class"));
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			int ch = 0;
			while ((ch = fis.read()) != -1) {
				out.write(ch);
			}
			data = out.toByteArray();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return data;
	}
}
 
分享到:
评论

相关推荐

    ClassLoader运行机制 自己写的

    在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...

    深入理解ClassLoader工作机制.docx

    《深入理解ClassLoader工作机制》 Java虚拟机(JVM)中的ClassLoader是负责加载类到内存中的核心组件。它不仅承担着将字节码转换为可执行对象的重任,还参与了类生命周期的各个阶段,包括加载、验证、准备、解析、...

    自定义classloader的使用

    在Java中,Classloader是加载类的关键组件,它负责查找、加载和初始化字节码文件。自定义Classloader允许开发者根据特定需求定制类的加载逻辑,例如加密类文件、隔离不同版本的库或者动态加载代码。本文将深入探讨...

    ClassLoader小例子

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。本示例"ClassLoader小例子"将深入探讨这个概念,并通过一个具体的程序来演示其工作原理。下面我们...

    classloader

    Java ClassLoader是Java运行时系统的关键但经常被忽视的组件,负责在运行时查找和加载类文件。通过创建自定义ClassLoader,你可以定制JVM,使类文件的引入方式完全重新定义,这提供了很多实用和有趣的可能。这篇教程...

    java ClassLoader机制及其在OSGi中的应用

    Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...

    classloader 加密解密应用程序 ,反编译class

    在Java编程语言中,`ClassLoader`是一个至关重要的组件,它负责加载类到JVM(Java虚拟机)中。本文将深入探讨`ClassLoader`的工作原理、加密解密应用程序以及如何防止类被反编译。 首先,让我们理解`ClassLoader`的...

    Java ClassLoader定制实例

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...

    lassLoader的关系以及如何防止ClassLoader内存泄漏

    在Java世界中,类加载器(ClassLoader)是关键的组件之一,它负责将类的字节码文件(.class)从文件系统或网络中加载到Java虚拟机(JVM)中,使得程序能够运行。本篇文章将深入探讨ClassLoader的关系网络以及如何...

    ClassLoader 详解.doc

    《ClassLoader详解》 Java应用程序的运行离不开类的加载,而ClassLoader正是这个过程的关键角色。它负责将类的字节码加载到Java虚拟机(JVM)中并转换为可执行的Java对象。深入理解ClassLoader的工作原理对于优化...

    理解Java ClassLoader机制

    Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...

    ClassLoader类加载机制和原理详解

    在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中执行。本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载...

    ClassLoader的 一些测试

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中执行。这篇测试主要探讨了ClassLoader的工作原理及其在实际应用中的使用。通过阅读给出的博文链接,我们可以深入理解...

    java classloader classpath 张孝祥

    ### Java ClassLoader与ClassPath详解 #### 一、概述 在Java编程中,类加载机制是十分关键的一个环节。类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath...

    classloader体系结构(含hotswap)

    Java的类加载器(ClassLoader)体系结构是JVM(Java虚拟机)中至关重要的一部分,它负责将类的字节码转换为运行时的类实例。本文将深入探讨启动类加载器、扩展类加载器、系统类加载器以及用户自定义类加载器,同时还...

    破解java加密的ClassLoader.java,在classloader植入破解代码

    破解java加密的ClassLoader.java,在classloader植入破解代码

Global site tag (gtag.js) - Google Analytics