简单加密解密(取反)操作 int a=3; //00000011 //^异或操作,相同为1,0xff,表示一个十六进制数,表示a和1111 1111 进行异或操作,结果为1111 1100 System.out.println(Integer.toBinaryString(a^0xff)); //对二进制取反,转换成二进制字符串 //ff表示1111 1111,f=15

public class Lockloader {

public static void main(String[] args) {

	encrpt("d:/myjava/HelloWorld.class","d:/myjava/com/sxt/in/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 len=-1;
		while((len=fis.read())!=-1) //会自动读取一个字节的数据
		{
			fos.write(len^0xff); 
		}
	}catch(IOException e)
	{
		e.printStackTrace();
	}finally {
		
		try {
			if(null!=fis)
			{
				fis.close();
			}
		}catch(IOException e)
		{
			e.printStackTrace();
		}
		try {
			if(null!=fos)
			{
				fos.close();
			}
		}catch(IOException e)
		{
			e.printStackTrace();
		}

	}
}
}

加载加密后的class字节码的类加载器

public class DecrptClassLoader extends ClassLoader{

private String dir;
public DecrptClassLoader(String dir)
{
	this.dir=dir;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException
{
	Class<?> c=findLoadedClass(name);
	
	if(null!=c)
	{
		return c;
	}else
	{
		ClassLoader parent=this.getParent();
		try {
		c=parent.loadClass(name);
		}catch(Exception e)
		{
			//e.printStackTrace();
		}
		if(c!=null)
		{
			return c;
		}else
		{
			byte[] data=getData(name);
			
			if(data==null)
			{
				throw new ClassNotFoundException();
			}else
			{
				c=defineClass(name,data,0,data.length);
				System.out.println("yes");
			}
		}
	}
	return c;
}

private byte[] getData(String classname)
{
	String path=dir+"/"+classname.replace('.', '/')+".class";
	
	InputStream is=null;
	ByteArrayOutputStream bos=new ByteArrayOutputStream();
	try {
		is=new FileInputStream(path);
		//解密操作
		
		int len=-1;
		while((len=is.read())!=-1)
		{
			bos.write(len^0xff);  //取反解密
		}
		
		return bos.toByteArray();
	}catch(IOException e)
	{
		e.printStackTrace();
		return null;
	}finally {
		try {
			if(null!=is)
			{
				is.close();
			}
		}catch(IOException e)
		{
			e.printStackTrace();
		}
		try {
			if(null!=bos)
			{
				bos.close();
			}
		}catch(IOException e)
		{
			e.printStackTrace();
		}
	}

}
}

加密后的class文件加载

/*	//正常加载器无法加载,因为读取的数据取反操作
	Loader loader =new Loader("d:/myjava");
	Class<?> c=loader.loadClass("com.sxt.in.HelloWorld");
	
	System.out.println(c);   */
	
	
	//使用解密加载器
	DecrptClassLoader dloader=new DecrptClassLoader("d:/myjava");
	Class<?> c=dloader.loadClass("com.sxt.in.HelloWorld");
	
	System.out.println(c.getClassLoader());