开发自己的类加载器_文件系统类加载器
来源:互联网 发布:乐视网络电视下载安卓 编辑:程序博客网 时间:2024/05/29 13:20
文件系统类加载器
第一个类加载器用来加载存储在文件系统上的 Java 字节代码。完整的实现如 代码清单 6 所示。
清单 6. 文件系统类加载器
public class FileSystemClassLoader extends ClassLoader { private String rootDir; public FileSystemClassLoader(String rootDir) { this.rootDir = rootDir; } protected Class<?> findClass(String name) throws ClassNotFoundException { byte[] classData = getClassData(name); if (classData == null) { throw new ClassNotFoundException(); } else { return defineClass(name, classData, 0, classData.length); } } private byte[] getClassData(String className) { String path = classNameToPath(className); try { InputStream ins = new FileInputStream(path); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int bufferSize = 4096; byte[] buffer = new byte[bufferSize]; int bytesNumRead = 0; while ((bytesNumRead = ins.read(buffer)) != -1) { baos.write(buffer, 0, bytesNumRead); } return baos.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return null; } private String classNameToPath(String className) { return rootDir + File.separatorChar + className.replace('.', File.separatorChar) + ".class"; } }
如 代码清单 6 所示,类 FileSystemClassLoader
继承自类 java.lang.ClassLoader
。在 表 1 中列出的 java.lang.ClassLoader
类的常用方法中,一般来说,自己开发的类加载器只需要覆写 findClass(String name)
方法即可。java.lang.ClassLoader
类的方法 loadClass()
封装了前面提到的代理模式的实现。该方法会首先调用 findLoadedClass()
方法来检查该类是否已经被加载过;如果没有加载过的话,会调用父类加载器的 loadClass()
方法来尝试加载该类;如果父类加载器无法加载该类的话,就调用 findClass()
方法来查找该类。因此,为了保证类加载器都正确实现代理模式,在开发自己的类加载器时,最好不要覆写 loadClass()
方法,而是覆写 findClass()
方法。
类 FileSystemClassLoader
的 findClass()
方法首先根据类的全名在硬盘上查找类的字节代码文件(.class 文件),然后读取该文件内容,最后通过 defineClass()
方法来把这些字节代码转换成 java.lang.Class
类的实例。
表 1. ClassLoader 中与加载类相关的方法
getParent()
返回该类加载器的父类加载器。loadClass(String name)
加载名称为 name
的类,返回的结果是 java.lang.Class
类的实例。findClass(String name)
查找名称为 name
的类,返回的结果是 java.lang.Class
类的实例。findLoadedClass(String name)
查找名称为 name
的已经被加载过的类,返回的结果是 java.lang.Class
类的实例。defineClass(String name, byte[] b, int off, int len)
把字节数组 b
中的内容转换成 Java 类,返回的结果是 java.lang.Class
类的实例。这个方法被声明为 final
的。resolveClass(Class<?> c)
链接指定的 Java 类。
- 开发自己的类加载器_文件系统类加载器
- 自定义文件系统类加载器
- 自定义文件系统类加载器
- 基础加强_类加载器,类的加载机制
- 使用自己定义的类加载器 加载类
- 自己写的类加载器
- 自己编写的解密类加载器
- 实现自己的类加载器
- 反射_类加载器_代理
- 自己做类加载器
- 深入java虚拟机(八)开发自己的类加载器
- 深入java虚拟机(八)开发自己的类加载器
- Java类加载器的学习---底层类加载器思想以及自己写的类加载器
- 黑马程序员_类加载器
- 黑马程序员_类加载器
- 黑马程序员_类加载器
- 黑马程序员_高新技术(类加载器)
- 黑马程序员_类加载器
- Hibernate many-to-one的Lazy设置的问题
- URL传递中文参数乱码问题
- vector 和list
- getSession()与getHibernateTemplate()区别
- bytecode操作
- 开发自己的类加载器_文件系统类加载器
- Web编程是函数式编程
- mssql出错:A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations.
- 年终了,为这一年留下点东西吧
- filter-mapping顺序
- hibernate 批量操作
- 【转】GTY(())的内部
- WF-异常捕获与补偿的应用说明
- JSF2自定义组件编程系列 第四部分