最近在琢磨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虚拟机(JVM)中的一个重要特性:动态类加载(Dynamic Class Loading)。这一机制为Java平台提供了强大的能力,允许在运行时安装软件组件,例如从网络下载...
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...
ClassLoader原理的理解对于深入学习Java和进行系统优化至关重要。这篇博文将带你深入了解ClassLoader的工作机制。 首先,我们来理解ClassLoader的基本概念。ClassLoader是一个抽象的概念,它是Java中的一个接口,...
这篇博文(虽然链接不可用)可能深入探讨了ClassLoader的工作原理及其在Java应用程序中的应用。 ClassLoader分为三个主要层次:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader(也称为System ...
Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中...理解并掌握ClassLoader的工作原理和在OSGi中的应用,对于开发高效、可扩展的Java应用程序至关重要。
总之,这个名为“测试普通Java程序ClassLoader等级关系的Demo程序”旨在帮助开发者掌握Java中类加载器的工作原理和它们之间的层次关系,这对于理解Java应用程序的运行机制和进行问题排查具有非常实际的意义。...
Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...
### WebSphere ClassLoader原理 #### 一、概述 在探讨WebSphere Application Server v6中的ClassLoaders之前,我们首先简要回顾一下ClassLoaders的基本概念及其在Java虚拟机(JVM)中的作用。 **ClassLoaders**是...
本文详细介绍了 Java 中的类加载器及其工作原理,包括类加载器的不同类型、类的加载过程以及类加载器与类实例化的关联。深入理解类加载机制对于开发高质量的 Java 应用程序至关重要,特别是在处理多层架构、模块化...
在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中执行。本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载...
在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,包括引导类加载器(Bootstrap ...
通过对`ClassLoader`的基本概念、工作原理、双亲委托机制以及不同类型的类加载器的了解,我们可以更好地理解Java类加载的过程及其背后的设计哲学。这对于深入理解Java虚拟机的内部机制以及开发高质量的应用程序都至...
Java 类加载器(ClassLoader)是Java虚拟机(JVM)的重要组成部分,它负责在运行时查找并加载类到JVM中。这个教程将深入探讨ClassLoader的工作原理、类型以及如何自定义类加载器。 一、Java ClassLoader 基础 1. 类...
为了更好地理解和利用Java的这一特性,本篇将详细介绍Java ClassLoader的作用及其工作原理,并通过构建一个示例ClassLoader来帮助读者深入理解如何自定义ClassLoader,从而扩展JVM的功能。 #### 二、ClassLoader...
### Java ClassLoader (类加载器)详解 #### 一、教程提示 ...掌握了类加载器的原理和技术,开发者可以更加灵活地管理Java应用程序中的类加载过程,这对于优化性能和增强应用程序的安全性都有重要意义。
在Java世界里,类加载器(ClassLoader)是理解JVM工作原理的关键一环。它负责将字节码文件(.class)从磁盘、网络或其他数据源加载到内存,并转化为运行时的Class对象,从而实现代码的动态加载和隔离。开源项目...
前面已经写过一篇关于java classloader的拙文java classloader原理初探。 时隔几年,再看一遍,觉得有些地方显得太过苍白,于是再来一篇: 完成一个Java类之后,经过javac编译,会生成一个class文件,这个...