自定义类加载器的实现
来源:互联网 发布:淘宝删除的购物车 编辑:程序博客网 时间:2024/05/16 14:46
Java的类加载器自从JDK1.2开始便引入了一条机制,叫做父类委托机制。也就是说,一个类需要被加载的时候,
JVM先会调用他的父类加载器进行加载。如果父类加载器加载不了,再使用其子类进行加载。当然,这类所说的父类加
载器,不一定他们之间是继承的关系,有可能仅仅是包装的关系。不能片面理解。
Java之所以出现这条机制,因为是处于安全性考虑。害怕用户自己定义class文件然后自己写一个类加载器来加载
原本应该是JVM自己加载的类。这样会是JVM虚拟机混乱或者说会影响到用户的安全。
下面我们来自己实现一个类加载器,其中主要就是继承ClassLoader类
package com.bird.classLoad;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class MyClassLoader extends ClassLoader {private String name; // 类加载器的名字private String path = "d://"; // 加载类的路径private final String fileType = ".class"; // .class文件扩展名public MyClassLoader(String name) {super();// 让系统加载器成为该类的加载器的父类加载器this.name = name;}public MyClassLoader(ClassLoader parent, String name) {super(parent); // 显示指定该类加载器的父加载器this.name = name;}@Overridepublic String toString() {return this.name;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}/** * 读取class文件作为二进制流放入到byte数组中去 * @param name * @return */private byte[] loadClassData(String name) {InputStream in = null;byte[] data = null;ByteArrayOutputStream baos = null;try {name = name.replace(".", "\\");in = new BufferedInputStream(new FileInputStream(new File(path+ name + fileType)));baos = new ByteArrayOutputStream();int ch = 0;while (-1 != (ch = in.read())) {baos.write(ch);}data = baos.toByteArray();} catch (Exception e) {e.printStackTrace();} finally {try {in.close();} catch (IOException e) {e.printStackTrace();} finally {try {baos.close();} catch (IOException e) {e.printStackTrace();}}}return data;}/** * JVM调用的加载器的方法 */@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {byte[] data = this.loadClassData(name);return this.defineClass(name, data, 0, data.length);}public static void main(String[] args) throws Exception {MyClassLoader loader1 = new MyClassLoader("loader1");loader1.setPath("d://");test(loader1);}public static void test(ClassLoader loader) throws Exception{Class<?> clazz = loader.loadClass("com.bird.classLoad.Simple");Object object = clazz.newInstance();}}
protected Class<?> findClass(String name) 这个方法是JVM自己调用的,如果覆盖CLassLoader类,必须覆盖这个方
法才能实现类的加载。然后里面的private byte[] loadClassData(String name) 方法是加载class文件变成二进制文件,
以便加载器完成class的引用。
- 自定义类加载器的实现
- 自定义Java类加载器的实现
- 自定义类加载器的实现,类加载过程
- 自定义类加载器的实现,类加载过程
- JVM 自定义的类加载器的实现和使用
- JVM 自定义的类加载器的实现和使用
- JVM 自定义的类加载器的实现和使用
- 实现一个简单的自定义类加载器
- java 自定义类加载器ClassLoader的实现方式
- 自定义类加载器的实现和使用?
- 实现自定义类加载器-ClassLoader
- 自定义类加载器实现常见功能
- 实现java中自定义类加载器
- 自定义实现Java类加载器
- Java自定义类加载器实现
- 自定义类的加载器
- 类加载机制实现原理以及自定义类加载器
- 自定义类的加载
- git命令
- Tomcat下Servlet的开发
- iPhone/iPad开发札记2012/03/12 Audio Unit
- 小生杂谈
- 一些重要网址
- 自定义类加载器的实现
- Android --- Frame动画示例
- 188. Great men's sons seldom do well. 富不过三代
- html 锚点链接 图像热区链接
- windows phone 7 变砖恢复方法
- 手机上, 除了游戏, 还能做什么?
- 多囊肿都有哪些治疗方法
- 好书推荐二号首张1 2 3部
- 连接ACCESS 数据库不能使用 '';文件已在使用中。