java 自定义类加载器

    对于java自定义的类加载器,须要继承ClassLoader类,而且实现它的findClass方法,而后调用父类的defineClass方法,返回加载后的类 java

    defineClass方法要求一个类的权限定名称获取定义此类的二进制字节流。这个是虚拟机的规范,可是这个规范并不具体,这样就为各个不一样虚拟机版本实现提供了很大的空间,好比它并无规范这个二进制字节流是从哪里来的, tomcat

  • 从ZIP包进行读取,这就成为了 的war,jar,EAR格式的基础,
  • 能够计算时动态生成,这就为动态代理提供了可能,
  • 能够从网络中获取,这就发展成了Applet,
  • 固然还能有其余的文件生成,例如JSP技术

本示例代码很是简单,仅仅是直接调用一个本地的class文件进行加载,加载完成之后,调用这个文件的sayHi把语句输出到控制台 网络

一、一个须要被加载的类 ide

package com.example.tomcat;

public class Foo {

	public void sayHi(){
		System.out.println("hello world");
	}
}
二、自定义的类加载器
package com.example.tomcat;

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

public class MyClassLoader extends ClassLoader {

	//类加载器的名称
    private String name;
    //类存放的路径
    private String classpath = "D:\\stsworkspace\\demo\\target\\classes\\com\\example\\tomcat\\";
   
    
    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(classpath + 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;
    }
    
    public static void main(String args[]) throws Exception{
    	MyClassLoader my = new MyClassLoader("myLoader");
    	Class<?> loadClass = my.loadClass("com.example.tomcat.Foo");
    	Foo cast = (Foo)loadClass.newInstance();
    	cast.sayHi();
    	
    }
}
相关文章
相关标签/搜索