自定义类加载器实现对字节码文件的加密和解密

package chart03.classLoader;

import java.util.Date;
/**
 * 需要进行加密java文件,(对该java文件生成的字节码进行加密。同时删除生成的字节码。那么我们就不能使用AppclassLoader进行访问)
 *
 */
public class CypherClass extends Date {
	
	@Override
	public String toString(){
		return "abcdvc";
	}

}

package chart03.classLoader;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;



/**
 * 对文件进行加密和解密的算法。
 * 使用对二进制文件进行取反运算,即0变成1 1变成0  在这里可能需要传入两个参数
 * 一个参数是:原来字节码的绝对路径(全路径名)
 * 另外一个参数是你要存放加密后的字节码的目录
 * @author heshengjun
 *
 */
public class CypherFile {


	public static void main(String[] args) throws Exception {
		String srcPath=args[0];
		String desDir=args[1];
		System.out.println(args[0]);
		FileInputStream fis=new FileInputStream(srcPath);
		String desFileName=srcPath.substring(srcPath.lastIndexOf("\\")+1);
		String desPath=desDir+"\\"+desFileName;
		FileOutputStream fos=new FileOutputStream(desPath);
		cypher(fis,fos);
		fis.close();
		fos.close();
	}
	
	private static void cypher(InputStream in,OutputStream out) throws Exception{
		int b=-1;
		while((b=in.read())!=-1){
			out.write(b^0xff);
		}
	}

}
package chart03.classLoader;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
 * 自己定义一个类加载器继承classLoader 实现findClass和definedclass
 * 需要注意的是这个类加载器并没有实现委托加载模式
 * @author heshengjun
 *
 */
public class SelfClassLoad extends ClassLoader{
	private String srcPath;
	public SelfClassLoad() {
		
	}
	public SelfClassLoad(String srcPath) {
		this.srcPath=srcPath;
	}
	
	@SuppressWarnings("deprecation")
	@Override
	protected Class findClass(String name) throws ClassNotFoundException {
		String classFileName=srcPath+"\\"+name+".class";
		try {
			FileInputStream fis=new FileInputStream(classFileName);
			ByteArrayOutputStream bos=new ByteArrayOutputStream();
			System.out.println("run here...");
			cypher(fis,bos);
			byte[] bytes=bos.toByteArray();
			fis.close();
			bos.close();
			return defineClass(null,bytes, 0, bytes.length);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 解密算法
	 * @param in
	 * @param out
	 * @throws Exception
	 */
	public static void cypher(InputStream in,OutputStream out)throws Exception{
		int b=-1;
		while((b=in.read())!=-1){
			out.write(b^0xff);
		}
	}
	
}

package chart03.classLoader;

import java.util.Date;



public class TestselfClassLoader {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		
			Class clazz=new SelfClassLoad("F:\\javaxianmushili\\javademo\\bin\\chart03\\classLoader").loadClass("CypherClass");

			Date date=(Date) clazz.newInstance();
			
			ClassLoader classLoader=date.getClass().getClassLoader();
			while(classLoader!=null){
				System.out.println(classLoader);
				classLoader=classLoader.getParent();
				
			}
			
			System.out.println(date.toString());
	}

}



你可能感兴趣的:(javase)