当前位置:首页 > 开发 > 编程语言 > 加密解密 > 正文

自定义加密的类加载器

发表于: 2013-09-01   作者:chinrui   来源:转载   浏览次数:
摘要: 自定义加密的类加载器 1、加载器初识 JVM有有三种类加载器: *BootStrap加载JRE\lib\rt.jar *ExtClassLoader加载JRE/lib/ext/*.jar *AppClassLoader加载classpath指定目录下的类 2、自定义加载器 1)被加载的类 public class ClassAttachment { public Cl
自定义加密的类加载器

1、加载器初识
JVM有有三种类加载器:
*BootStrap加载JRE\lib\rt.jar
*ExtClassLoader加载JRE/lib/ext/*.jar
*AppClassLoader加载classpath指定目录下的类
2、自定义加载器
1)被加载的类
public class ClassAttachment {

	public ClassAttachment() {
		System.out.println("Hello,World");
	}

}


2)加密class的加密器
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Cypher {
	
	public static void main(String[] args) throws IOException {
		String srcPath =
              "D:\\Android\\reflect\\bin\\classloader\\ClassAttachment.class";
		String destPath = "cypherClass";
		String fileName = srcPath.substring(srcPath.lastIndexOf('\\') + 1);
		String destFilePath = destPath + "\\" + fileName;
		FileInputStream fis = new FileInputStream(srcPath);
		FileOutputStream fos = new FileOutputStream(destFilePath);
		cypher(fis, fos);
		fis.close();
		fos.close();
	}

	// 进行简单加密
	public static void cypher(InputStream is, OutputStream os) {
		int b;
		try {
			while ((b = is.read()) != -1) {
				os.write(b ^ 0xff);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


3)自定义的加载器
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class MyClassLoader extends ClassLoader {
	
	// 指定存放加密的class的目录
	private String classDir;
	
	public MyClassLoader() {
	}
	
	public MyClassLoader(String classDir) {
		this.classDir = classDir;
	}

	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {
		// 生成加密class文件信息
		String classFileName =
      classDir + "\\" + name.substring(name.lastIndexOf('.') + 1) + ".class";
		
		try {
			System.out.println("-----through MyClassLoader-----");
			FileInputStream fis = new FileInputStream(classFileName);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			// 解密
			Cypher.cypher(fis, baos);
			byte[] classByte = baos.toByteArray();
			fis.close();
			baos.close();
			
			// 根据byte[]生成Class
			return defineClass(null, classByte, 0, classByte.length);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return super.findClass(name);
	}
}

4)测试自定义的加载器
public class MyClassLoaderTest {

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

		Class clazz =
   new MyClassLoader("cypherClass").loadClass("classloader.ClassAttachment");
		clazz.newInstance();
	}
}

测试方法:
新建一个cypherClass目录,通过加密器加密自动编译的ClassAttachment.class,用它覆盖掉原来的.class文件,由于,类加载的过程中,会先让上一级的加载器进行加载,如果,上一级的加载器没有找到要加载的class文件,才会让下一级的类加载器进行加载,由于AppClassLoader现在可以找到加密后的ClassAttachment.class文件,所以,会出现如下错误:
[color=red]
java.lang.ClassFormatError: Incompatible magic value 889275713 in class file classloader/ClassAttachment
[/color]
如果将原目录下的ClassAttachment.class文件删除掉,即让AppClassLoader找不到ClassAttachment.class文件,让下一级的类加载器进行加载,即自定义的加载器加载,程序运行成功:
运行结果:
-----through MyClassLoader-----
Hello,World

自定义加密的类加载器

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在大多数情况下,系统默认提供的类加载器实现已经可以满足需求。但是在某些情况下,您还是需要为应
写好了一个程序,我们一般是把.class字节码文件交给用户,让用户去运行。但是,一些反编译工具能通
Java的类加载器自从JDK1.2开始便引入了一条机制,叫做父类委托机制。也就是说,一个类需要被加载的
概述 public abstract class ClassLoader extends Object 类加载器是负责加载类的对象。ClassLoader
1,什么是类加载器? 加载类的工具. 2,类加载器有什么作用? 当程序需要的某个类,那么需要通过类加载器
转:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器是 Java 语言的一个创
一篇好文章:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器是 Java 语言
当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构: bootstrap classlo
jvm classLoader architecture : a, Bootstrap ClassLoader/启动类加载器 主要负责jdk_home/lib目录
其他参考: 1 http://gzcj.iteye.com/blog/394648 2 http://blog.sina.com.cn/s/blog_5f1fe33f0100d9
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号