美文网首页jvm
虚拟机类加载机制【类与类加载器】

虚拟机类加载机制【类与类加载器】

作者: 云芈山人 | 来源:发表于2021-08-02 23:52 被阅读0次

类加载阶段中“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现(实现的代码叫做“类加载器(Class Loader)”),以便让应用程序自己决定如何获取所需的类。

类加载器起初是为了满足Java Applet的需求设计出来的,虽然在如今基本被淘汰,但在类层次划分、OSGi、程序热部署、代码加密等领域大放异彩,成为Java技术体系中的一块重要的基石。

  • 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每个类加载器,都拥有一个独立的类名称空间。
  • 两个类即使来源于同一个Class文件,被同一个Java虚拟机加载,只要加载他们的虚拟机不同,那这两个类就必定不相等。
  • 这里的相等,包括代表类的Class对象的equals()方法、isAssignableForm()方法、isInstance()方法的返回结果,也包括使用instanceof关键字做对象所属关系判定等各种情况。
package com.test;

import java.io.IOException;
import java.io.InputStream;


/**
 * 类加载器与instanceof关键字
 * @author huyl
 *
 */
public class ClassLoaderTest {

    public static void main(String[] args) throws Exception {
        
        ClassLoader myLoader = new ClassLoader(){
            public Class<?>  loadClass(String name) throws ClassNotFoundException{
                try{
                    String fileName = name.substring(name.lastIndexOf(".")+1)+".class";
                    InputStream is = (InputStream) getClass().getResourceAsStream(fileName);
                    if( is == null ){
                        return super.loadClass(name);
                    }
                    byte[] b = new byte[is.available()];
                    is.read(b);
                    return defineClass(name, b,0, b.length);
                }catch(IOException e){
                    throw new ClassNotFoundException(name);
                }
            }
        };
        
        Object obj = myLoader.loadClass("com.test.ClassLoaderTest").newInstance();
        System.out.println(obj.getClass());
        System.out.println(obj instanceof com.test.ClassLoaderTest);
    }
}

输出结果

class com.test.ClassLoaderTest
false

分析原因:
这是因为Java虚拟机中同时存在了两个ClassLoaderTest类,一个是由虚拟机的应用程序类加载器所加载的,另外一个是由我们自定义的类加载器加载的,虽然他们都来自第一个Class文件,但在Java虚拟机中仍然是两个互相独立的类,做对象所属类型检查时的结果自然为false。

《深入理解Java虚拟机》学习笔记

相关文章

  • JVM-类加载器

    类加载器 类加载器是用来把类加载到JAVA虚拟机中。 类加载的过程 类的加载过程采用了父亲委托的机制,这种机制能更...

  • 深入理解Java类加载器

    本文主要内容 类加载器基本概念 自定义类加载器 类的隔离 Android类加载器案例 虚拟机类加载机制 文中已经对...

  • 《深入理解JVM虚拟机》读书笔记-类加载器&Java模块化系统

    类加载器 一.类加载器 1.1 类与类加载器 类加载器的定义: Java虚拟机设计团队有意把 类加载阶段中 的“ ...

  • 深入理解Java类加载

    本文目的: 深入理解Java类加载机制; 理解各个类加载器特别是线程上下文加载器; Java虚拟机类加载机制 虚拟...

  • 深入理解 Java 类加载

    本文目的: 深入理解Java类加载机制; 理解各个类加载器特别是线程上下文加载器; Java虚拟机类加载机制 虚拟...

  • 读《深入理解Java虚拟机》- 笔记07

    《深入理解Java虚拟机:JVM高级特性与最佳实践》第2版 第7章 虚拟机类加载机制 51. 类加载器 类加载阶段...

  • 6.虚拟机类加载机制及类加载器

    虚拟机类加载机制及类加载器 1. 类加载的时机 类的整个生命周期包括:加载(Loading)、验证(Verific...

  • JVM 类加载机制

    简介 类加载机制包括 类加载过程 和 类加载器。 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据...

  • Java虚拟机——类加载机制和类加载器

    Java虚拟机——类加载机制和类加载器 类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周...

  • 虚拟机类加载机制

    虚拟机类加载机制 @(Java虚拟机)[类加载] [TOC] 类加载时机 类加载到卸载的生命周期包括: 加载(Lo...

网友评论

    本文标题:虚拟机类加载机制【类与类加载器】

    本文链接:https://www.haomeiwen.com/subject/mplsvltx.html