`
gaopengxiang417
  • 浏览: 21700 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java中的classloader的原理

    博客分类:
  • JVM
 
阅读更多
最近在琢磨btrace,顺便也看了下JDK的classloader的原理

先直接把代码贴出来:
首先是main方法:
package com.gao;

import com.wang.MyClass;

/**
 * User: wangchen.gpx
 * Date: 12-12-28
 * Time: 上午9:35
 */
public class ClassLoaderTeste {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        MyClassLoader myclassloader = new MyClassLoader("myclassloader");
        Class<?> myClass = myclassloader.loadClass("com.wang.MyClass");
        Object o = myClass.newInstance();
        MyClass myClass1 = (MyClass) o;
        myClass1.say();
    }
}

然后是自定义的classloader
package com.gao;

import java.io.*;

/**
 * User: wangchen.gpx
 * Date: 12-12-28
 * Time: 上午9:26
 */
public class MyClassLoader extends ClassLoader {
    private String loaderName;
    private String path = "G:\\idea_workspace\\asmTest\\out\\production\\asmTest\\java\\java\\";

    public MyClassLoader(String loaderName) {
        this.loaderName = loaderName;
    }

    public MyClassLoader(ClassLoader parent, String loaderName) {
        super(parent);
        this.loaderName = loaderName;
    }

    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        return this.findClass(name);
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        System.out.println("find class");
        byte[] bytes = this.loadClassData(name);
        return this.defineClass(name, bytes, 0, bytes.length);
    }

    private byte[] loadClassData(String name) {
        try {
            name = name.replace(".", "//");
            FileInputStream fileInputStream = new FileInputStream(new File(path + name + ".class"));
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            int b  = 0;
            while ((b = fileInputStream.read()) != -1) {
                byteArrayOutputStream.write(b);
            }
            return byteArrayOutputStream.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

最后是用来装载的class:
package com.wang;

/**
 * User: wangchen.gpx
 * Date: 12-12-28
 * Time: 上午9:08
 */
public class MyClass {
    public MyClass() {
        System.out.println("constructor");
    }

    public void say(){
        System.out.println("one");
    }
}


这里首先跑的话,我认为应该是直接走自己的classloader的findclass方法,但是我错了,根本就没有走到这里,所以就比较纳闷,自己看了下classloader的源码,原来是这样:
protected synchronized Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException
    {
        // First, check if the class has already been loaded
        //这里首先查看该类是否已经装载了,像我们自定义的类,现在还没有装载,因此这里应该返回的是null
        Class c = findLoadedClass(name);
        if (c == null) {
            try {
                if (parent != null) {
                    //注意这里,他首先会用父classloader去装载,父类classloader也会调用它的
                    //父类classloader进行装载,已经递归下去,直到进入bootstrapclassloader
                    //如果bootstrapclassloader找不到该类,那么他将委托为appClassloader去装载
                    //这个就是所说的双亲委派模型
                    c = parent.loadClass(name, false);
                } else {
                    //这一步就是最后到达的bootstrapclassloader
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
                // ClassNotFoundException thrown if class not found
                // from the non-null parent class loader
            }
            //注意这里,只有真的找不到的时候才会进入这一步,调用自己实现的findclass方法来loadclass
            if (c == null) {
                // If still not found, then invoke findClass in order
                // to find the class.
                c = findClass(name);
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }


所以这次又对类加载的机制有了一定的了解,主要是双亲委派模型的实际含义
分享到:
评论

相关推荐

    Java ClassLoader原理

    ### Java ClassLoader原理详解 #### 摘要 本文探讨了Java虚拟机(JVM)中的一个重要特性:动态类加载(Dynamic Class Loading)。这一机制为Java平台提供了强大的能力,允许在运行时安装软件组件,例如从网络下载...

    Java ClassLoader定制实例

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

    ClassLoader原理

    ClassLoader原理的理解对于深入学习Java和进行系统优化至关重要。这篇博文将带你深入了解ClassLoader的工作机制。 首先,我们来理解ClassLoader的基本概念。ClassLoader是一个抽象的概念,它是Java中的一个接口,...

    java classloader

    这篇博文(虽然链接不可用)可能深入探讨了ClassLoader的工作原理及其在Java应用程序中的应用。 ClassLoader分为三个主要层次:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader(也称为System ...

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

    Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中...理解并掌握ClassLoader的工作原理和在OSGi中的应用,对于开发高效、可扩展的Java应用程序至关重要。

    测试普通Java程序ClassLoader等级关系的Demo程序

    总之,这个名为“测试普通Java程序ClassLoader等级关系的Demo程序”旨在帮助开发者掌握Java中类加载器的工作原理和它们之间的层次关系,这对于理解Java应用程序的运行机制和进行问题排查具有非常实际的意义。...

    理解Java ClassLoader机制

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

    webshpere classloader 原理

    ### WebSphere ClassLoader原理 #### 一、概述 在探讨WebSphere Application Server v6中的ClassLoaders之前,我们首先简要回顾一下ClassLoaders的基本概念及其在Java虚拟机(JVM)中的作用。 **ClassLoaders**是...

    Java_ClassLoader详解

    本文详细介绍了 Java 中的类加载器及其工作原理,包括类加载器的不同类型、类的加载过程以及类加载器与类实例化的关联。深入理解类加载机制对于开发高质量的 Java 应用程序至关重要,特别是在处理多层架构、模块化...

    ClassLoader类加载机制和原理详解

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

    java的ClassLoader类加载器机制

    在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,包括引导类加载器(Bootstrap ...

    ClassLoader

    通过对`ClassLoader`的基本概念、工作原理、双亲委托机制以及不同类型的类加载器的了解,我们可以更好地理解Java类加载的过程及其背后的设计哲学。这对于深入理解Java虚拟机的内部机制以及开发高质量的应用程序都至...

    Java ClassLoader Tutorial.zip

    Java 类加载器(ClassLoader)是Java虚拟机(JVM)的重要组成部分,它负责在运行时查找并加载类到JVM中。这个教程将深入探讨ClassLoader的工作原理、类型以及如何自定义类加载器。 一、Java ClassLoader 基础 1. 类...

    Understanding the Java ClassLoader

    为了更好地理解和利用Java的这一特性,本篇将详细介绍Java ClassLoader的作用及其工作原理,并通过构建一个示例ClassLoader来帮助读者深入理解如何自定义ClassLoader,从而扩展JVM的功能。 #### 二、ClassLoader...

    JAVA ClassLoader 讲解 (类加载器)

    ### Java ClassLoader (类加载器)详解 #### 一、教程提示 ...掌握了类加载器的原理和技术,开发者可以更加灵活地管理Java应用程序中的类加载过程,这对于优化性能和增强应用程序的安全性都有重要意义。

    classloader-playground, 一个简单的java依赖隔离容器类.zip

    在Java世界里,类加载器(ClassLoader)是理解JVM工作原理的关键一环。它负责将字节码文件(.class)从磁盘、网络或其他数据源加载到内存,并转化为运行时的Class对象,从而实现代码的动态加载和隔离。开源项目...

    Java classloader原理深究

    前面已经写过一篇关于java classloader的拙文java classloader原理初探。  时隔几年,再看一遍,觉得有些地方显得太过苍白,于是再来一篇:  完成一个Java类之后,经过javac编译,会生成一个class文件,这个...

Global site tag (gtag.js) - Google Analytics