`
wangleyiang
  • 浏览: 216097 次
社区版块
存档分类
最新评论

Java 类加载器的种类

    博客分类:
  • Java
阅读更多

1、定义:

寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件。

 

2、种类:

  • BootstrapClassLoader:用C++编写的,装载jre中的核心类库;
  • ExtClassLoader:装载jre目录下的ext中的jar类;
  • AppClassLoader:装载ClassPath路径下的类.
  • UrlClassLoader:装载Url指定的类;

3、测试:

public class Test {

	public static void main(String[] args) {

		ClassLoader loader = Test.class.getClassLoader();
		while (loader != null) {
			System.out.println(loader.getClass().getName());
			loader = loader.getParent();
		}
		System.out.println(loader);

	}

}

 输入结果:

sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
null

 

说明:

  • null:BootstrapClassLoader是用C++编写,而JVM设置ExtClassLoader的父加载器是null罢了;

4、一个自定义类加载器的例子:

package classloader;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;

/**
 * 
 * 一、ClassLoader加载类的顺序
 *  1.调用 findLoadedClass(String) 来检查是否已经加载类。
 *  2.在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。 
 *  3.调用 findClass(String) 方法查找类。
 * 二、实现自己的类加载器
 * 	1.获取类的class文件的字节数组
 * 	2.将字节数组转换为Class类的实例
 * 
 */
public class ClassLoaderTest {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		//新建一个类加载器
		MyClassLoader cl = new MyClassLoader("myClassLoader");
		//加载类,得到Class对象
		Class<?> clazz = cl.loadClass("classloader.Animal");
		//得到类的实例
		Animal animal=(Animal) clazz.newInstance();
		animal.say();
	}

}
class Animal{
	public void say(){
		System.out.println("hello world!");
	}
}
class MyClassLoader extends ClassLoader {
	//类加载器的名称
	private String name;
	//类存放的路径
	private String path = "E:\\workspace\\Algorithm\\src";

	MyClassLoader(String name) {
		this.name = name;
	}
	
	MyClassLoader(ClassLoader parent, String name) {
		super(parent);
		this.name = name;
	}
	/**
	 * 重写findClass方法
	 */
	@Override
	public Class<?> findClass(String name) {
		byte[] data = loadClassData(name);
		return this.defineClass(name, data, 0, data.length);
	}
	public byte[] loadClassData(String name) {
		try {
			name = name.replace(".", "//");
			FileInputStream is = new FileInputStream(new File(path + name + ".class"));
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			int b = 0;
			while ((b = is.read()) != -1) {
				baos.write(b);
			}
			return baos.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

}

本代码来自:http://www.oschina.net

 

 

 

分享到:
评论

相关推荐

    java类加载器

    ClassLoader 三种类加载方式 Boostrap Extenxsion 以及Application ClassLoad分别适用的场景

    java 类加载器 双亲委派 根加载器、扩展类加载器、系统类加载器

    类加载器分为根加载器(bootstrap classloader)、扩展类加载器(ext classloader)、系统类加载器(system classloader)、自定义类加载器(通常继承java.net.URLClassLoader,重写findClass()),它们的关系通常...

    【JVM】类加载器与双亲委派模型

    类加载器有以下种类: 启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用类加载器(Application ClassLoader) 启动类加载器 内嵌在JVM内核中的加载器,由C++语言编写(因此也...

    Java类加载机制浅析

     4.1类加载器分类  5、双亲委派机制   5.1、检查某个类是否已经加载   5.2、加载顺序  5.3、打破双亲委派机制 所谓类加载机制就是 虚拟机把Class文件加载到内存 并对数据进行校验,转换解析和初始化 形成...

    JAVA_API1.6文档(中文)

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    面试必问之jvm与性能优化

    Java的类加载器有三个,对应Java的三种类: 三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类加载器完成呢?为了解决这个问题,Java采用了委托模型机制。 委托模型机制的工作原理很简单:...

    Java 1.6 API 中文 New

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...

    阿里巴巴面试题总结

    阿里巴巴面试题总结 2018年05月28日 10:55:49 牧儿 阅读数:65更多 个人分类: 阿里巴巴 1. 在JVM中,类从被加载到虚拟机内存中开始,到...答:java有三个类加载器,分别为:根类加载器,扩展类加载器,系统类加载 器。

    java api最新7.0

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...

    JavaAPI1.6中文chm文档 part1

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    Java后端面试问题整理.docx

    • 熟悉常用IO模型(BIO、NIO、AIO),熟悉JVM类加载过程与机制 • 了解JVM性能监控以及调优,会使用jps、jstack、jmap、jstat、jhat,了解内存泄露排查具体方法 • Java基础 • 熟练的使用Java语言进行面向对象程序...

    疯狂JAVA讲义

    学生提问:构造器是创建Java对象的途径,是不是说构造器完全负责创建Java对象? 141 5.5.2 构造器的重载 142 学生提问:为什么要用this来调用另一个重载的构造器?我把另一个构造器里的代码复制、粘贴到这个构造器...

    Java 基础核心总结 +经典算法大全.rar

    JDBC 加载数据库驱动类反射的优势及缺陷 增加程序的灵活性破坏类的封装性 性能损耗 代理模式 静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 ...

    JavaAPI中文chm文档 part2

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    java jdk-api-1.6 中文 chmd

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    深入浅出类加载机制

    类加载器2.1 类加载器种类2.1.1 Java虚拟机自带的类加载器2.1.2 用户自定义的类加载器2.2 双亲委派机制2.2.1 为什么要有双亲委派机制2.2.2 可不可以自定义一个String/Object类?2.3 破坏双亲委派2.3.1 为何要破坏...

    Java虚拟机架构

    JVM被分为三个主要的子系统:类加载器子系统、运行时数据区、执行引擎Java的动态类加载功能是由类加载器子系统处理。当它在运行时(不是编译时)首次引用一个类时,它加载、链接并初始化该类文件。类由此组件加载。...

    JAVA反射机制详解视频

    (类加载器的概述和分类) (获取class文件对象的三种方式) (通过反射获取无参构造方法并使用) (通过反射获取带参构造方法并使用) (通过反射获取私有构造方法并使用) (通过反射获取成员变量并使用) (通过反射获取无参无...

Global site tag (gtag.js) - Google Analytics