自定义类加载

package com.lss;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
/**
 * 自定义类加载
 * @author SHOU SHEN LUAN
 *
 */
public class MyClassLoader extends ClassLoader {
	public static String CLASS_PATH = "D:\\";
	public String name;

	public MyClassLoader(String name) {
		this.name = name;

	}

	public MyClassLoader(ClassLoader classLoader, String name) {
		super(classLoader);
		this.name = name;
	}

	@Override
	public Class<?> findClass(String name) {
		System.out.println("findClass:" + name);
		byte[] data = loadClassData(name);
		return this.defineClass(name, data, 0, data.length);
	}
	/**
	 * 加载Class文件
	 * @param name
	 * @return
	 */
	public byte[] loadClassData(String name) {
		try {
			name = name.replace(".", "//");
			FileInputStream is = new FileInputStream(new File(CLASS_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;
	}
	/**
	 * 需要注意的是 如果当前项目指定目录中包含该Class文件的话,ClassLoader在调用findLoaderdClass时则可以加载或从类加载缓存中获取到该类对象,者不会调用findClass
	 * @param args
	 */
	public static void main(String[] args) {
		MyClassLoader classLoader = new MyClassLoader("myClassLoader");
		try {
			Class<?> clazz = classLoader.loadClass("com.lss.json.Pojo");
			Object object = clazz.newInstance();
			System.out.println(object.toString());
			/*自定义ClassLoader类*/
			System.out.println(object.getClass().getClassLoader());
			//AppClassLoader JVM用此ClassLoader来加载启动参数中指定的ClassPath中Jar包及目录
			System.out.println(object.getClass().getClassLoader().getParent());
			//ExtClassLoader JVM 用此ClassLoader 来加载扩展功能的一些Jar包,例如SunJDK 中目录下有dns工具Jar包等,
			System.out.println(object.getClass().getClassLoader().getParent().getParent());
			//sun.misc.Launcher$ExtClassLoader的父类是{Bootstrap ClassLoader}使用C++实现,在代码中无法拿到该对象
			//Sun JDK 启动时会初始化此ClassLoader,并由ClassLoader 完成 $JAVA_HOME中jre/lib/rt.jar里面所有Class文件的加载,Jar中包含了Javs规范定义的所有的接口实现
			System.out.println(object.getClass().getClassLoader().getParent().getParent().getParent());
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值