《黑马程序员》java 类加载器复习

本文介绍了一种使用自定义类加载器实现类加密,并将加密后的类文件转换并保存到指定目录的方法。通过创建类加载器实例,我们可以控制类的加载路径与行为,进而实现类的安全加密与高效文件操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类:

      BootStrap(jre/lib/rt.jar)、ExtClassLoader(jre/lib/ext/*.jar)、AppClassLoader(classPath指定的所有jar或目录)

2.类加载器也是java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这个加载器是:BootStrap(用c++写的)

3.java虚拟机中的搜有类加载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载器。


import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class MyLoader extends ClassLoader {

	public static void main(String args[]) throws IOException {
		ClassLoader loader = MyLoader.class.getClassLoader();
		while (loader != null) {
			System.out.println(loader);
			loader = loader.getParent();
		}
		String[] ss ={new String("E:\\javaweb\\enhanceHigh\\bin\\Test.class"),new String("class")};
		setClass(ss);

	}

	private static void setClass(String[] args) throws FileNotFoundException,
			IOException {
		String srcPath = args[0];
		String destDir = args[1];
		FileInputStream in = new FileInputStream(srcPath);

		String destPath = destDir + "\\"
				+ srcPath.substring(srcPath.lastIndexOf('\\') + 1);

		FileOutputStream out = new FileOutputStream(destPath);
		cypher(in, out);
		in.close();
		out.close();
	}

	@SuppressWarnings("deprecation")
	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {
		// TODO Auto-generated method stub
		String classFileName=classDir+"\\"+name+".class";
		try {
			FileInputStream fis=new FileInputStream(classFileName);
			ByteArrayOutputStream bos=new ByteArrayOutputStream();
			cypher(fis, bos);
			byte[] by=bos.toByteArray();
			return defineClass(by, 0, by.length);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return super.findClass(name);
	}
/**
 * 数据加密类
 * @param in
 * @param out
 * @throws IOException
 */
	public static void cypher(InputStream in, OutputStream out)
			throws IOException {
		int b = -1;
		while ((b = in.read()) != -1) {

			out.write(b ^ 0xff);

		}
	}
	private String classDir;
	public MyLoader(String classDir){
		this.classDir=classDir;
	}
}
运行此类可以进行自己编写类的加密,并将加密以后的类放到一个目录下面。

此类如果相运行,必须要用自定义的类加载器,即上面的类加载器。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值