自定义ClassLoader
来源:互联网 发布:使用weka进行数据挖掘 编辑:程序博客网 时间:2024/05/19 10:09
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:
- 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自
java.lang.ClassLoader
。 - 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
- 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过
ClassLoader.getSystemClassLoader()
来获取它。
一般情况下,系统提供的类加载器可以满足通常的应用需求。如果需要特殊的需求,如从工具动态生成的或者从网络上加载字节码文件,则需要定制自己的类加载器。用户自定义类加载器可以通过继承抽象类ClassLoader实现。以下是一个网络类加载器,负责加载从网上下载的字节码文件。
- package classloader;
- import java.io.ByteArrayOutputStream;
- import java.io.InputStream;
- import java.net.URL;
- public class NetworkClassLoaderextends ClassLoader {
- private String rootUrl;
- public NetworkClassLoader(String rootUrl) {
- this.rootUrl = rootUrl;
- }
- 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 {
- URL url = new URL(path);
- InputStream ins = url.openStream();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- int bufferSize = 4096;
- byte[] buffer = newbyte[bufferSize];
- int bytesNumRead = 0;
- while ((bytesNumRead = ins.read(buffer)) != -1) {
- baos.write(buffer, 0, bytesNumRead);
- }
- return baos.toByteArray();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- private String classNameToPath(String className) {
- return rootUrl + "/"
- + className.replace('.', '/') +".class";
- }
- }
package classloader;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.net.URL;public class NetworkClassLoader extends ClassLoader {private String rootUrl;public NetworkClassLoader(String rootUrl) {this.rootUrl = rootUrl;}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 {URL url = new URL(path);InputStream ins = url.openStream();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 (Exception e) {e.printStackTrace();}return null;}private String classNameToPath(String className) {return rootUrl + "/"+ className.replace('.', '/') + ".class";}}
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- Java_ClassLoader(ClassLoader / 自定义ClassLoader / DexClassLoader)
- 自定义一个ClassLoader.
- 自定义EclipsePlugin ClassLoader (2)
- 自定义classloader的实现
- 自定义ClassLoader 简单例子
- java 自定义ClassLoader
- 自定义ClassLoader类
- 自定义 Java ClassLoader
- 自定义ClassLoader解析
- Sublime text2 使用记叙
- 修身
- 使用HANDLE_MSG宏简化Win32应用的开发
- oracle 授权
- Sonar代码分析实战(1)
- 自定义ClassLoader
- Ruby 对Excel的操作
- CBitmap,HBitmap,Bitmap区别及联系
- WM_NCCALCSIZE消息处理详解
- 关于日期时间操作工具类DateUtil(二) -----对java.sql.Timestamp 的操作.
- hdu 1219 AC Me
- 使用UFT进行接口测试(Web Service、REST)
- C#中产生验证码图片
- 防止Sql注入filter