测试文件
package com.aflfte.test;
/**
* 简单的加密解密(取反)操作
*
* @author root
*
*/
public class Demo04 {
public static void main(String[] args) throws Exception {
//取反测试
/*int a=3;
System.out.println(Integer.toBinaryString(a^0xff));*/
DecrptClassLoader l=new DecrptClassLoader("/root/myjava");
Class<?> c=l.loadClass("com.aflfte.test.HelloWorld");
System.out.println(c);
}
}
加密类文件
package com.aflfte.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 加密工具类
* @author root
*
*/
public class EncrptUtil {
public static void main(String[] args) {
encrpt("/root/myjava/com/aflfte/test/HelloWorld.class","/root/myjava/com/aflfte/test/hw.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);//取反操作 相当于加密
}
fos.flush();
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
try {
if(fis!=null) {
fis.close();
}
if(fos!=null) {
fos.close();
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
解密类加载器代码:
package com.aflfte.test;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 加载文件系统加密后的类加载器
* @author root
*
*/
//第一步继承ClassLoader
public class DecrptClassLoader extends ClassLoader {
//转化过程:com.aflfte.test.User-->/root/mywork/类加载全过程/src/com/aflfte/test/User.class
private String rootDir;
public DecrptClassLoader(String rootDir) {
super();
this.rootDir = rootDir;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class<?> c=findLoadedClass(name);
if(c!=null) {//先检查有没有加载这个类,如果已经加载,则直接返回加载好的类.如果没有则加载新的类
return c;
}else {//如果没有加载则要他的父类先加载
ClassLoader parent=this.getParent();
try {
c=parent.loadClass(name);//委派给父类加载器进行加载
}catch (Exception e) {
//e.printStackTrace();
}
if(c!=null) {
return c;
}else {
byte[] classData=getClassData(name);
if(classData==null) {
throw new ClassNotFoundException();//如果没有加载成功则抛出异常
}else {
c=defineClass(name, classData, 0, classData.length);
}
}
}
return c;
}
private byte[] getClassData(String classname) {
String path=rootDir+"/"+classname.replace(".", "/")+".class";
//IOUtils可以使用它装数据流中的数据转成数组
InputStream is=null;
ByteArrayOutputStream baos=new ByteArrayOutputStream();
try {
is=new FileInputStream(path);
int temp=0;
while((temp=is.read())!=-1) {
baos.write(temp^0xff);//取反操作 相当于解密
}
baos.flush();
return baos.toByteArray();
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
return null;
}finally {
try {
if(is!=null) {
is.close();
}
if(baos!=null) {
baos.close();
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
//return null;
}
}
« 饿汉式单例模式
|
自定义类加载器»
|