如果想看一下简单的类加载器怎么自定义,可以跳转简单自定义类加载器
自定义加密解密类加载器
测试简单的class文件加密解密(取反操作)。取反加密只是一个简单示例。
加密工具类(字节按位取反)
package com.feng.ClassTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 加密工具类
* @author feng
*
*/
public class EncrpUtil {
public static void main(String[] args) {
// TODO Auto-generated method stub
encrpt("E:\\myjava\\HelloWorld.class", "E:\\myjava\\temp\\HelloWorld.class");
}
public static void encrpt(String src, String dest) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(src);
fos = new FileOutputStream(dest);
int temp = -1;
while((temp = fis.read()) != -1) {
fos.write(temp^0xff); //异或,每个字节按位取反
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(fis != null) {
fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(fos != null) {
fos.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
解密类加载器
package com.feng.ClassTest;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 加载文件系统加密后的class字节码的类加载器
* @author feng
*
*/
public class DecreptClassLoader extends ClassLoader {
private String rootDir;
public DecreptClassLoader(String rootDir) {
this.rootDir = rootDir;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class<?> c = null;
byte[] classData = getClassData(name); // 自定义方法获取类字节码
if(classData == null) {
throw new ClassNotFoundException(); // 如果字节数组为空,抛出异常
} else {
try {
c = defineClass(name, classData, 0, classData.length);
} catch (ClassFormatError e){ // 加载错误
e.printStackTrace();
c = null;
}
}
return c;
}
private byte[] getClassData(String classname) {
// 拼出类class文件地址
String path = rootDir + "/" + classname.replace('.', '/') + ".class";
InputStream fis = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
fis = new FileInputStream(path);
int temp = -1;
while((temp = fis.read()) != -1) {
baos.write(temp^0xff); //异或,每个字节按位取反
}
return baos.toByteArray();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} finally {
try {
if(fis != null) {
fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(baos != null) {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
测试自定义解密类加载器
package com.feng.ClassTest;
public class Demo04 {
public static void main(String[] args) throws ClassNotFoundException {
//加密后的class文件,正常的类加载器 无法加载,会报FormatError错误
//FileSystemClassLoader loader = new FileSystemClassLoader("E:\\myjava\\temp");
//Class<?> c = loader.findClass("HelloWorld");
//System.out.println(c);
// 使用解密类加载器
DecreptClassLoader loader = new DecreptClassLoader("E:\\myjava\\temp");
Class<?> c = loader.loadClass("HelloWorld");
System.out.println(c);
}
}