jvm

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

2021-08-02  本文已影响0人  云芈山人

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

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

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虚拟机》学习笔记

上一篇 下一篇

猜你喜欢

热点阅读