最近学习到了自定义ClassLoader,根据老师教授的对文件的解密加密,自己实现了许多,下面说说比较关键的几个点。
1.怎么取反?
先来了解一下" ^ "这个操作符,位或与,对于二进制数来说,相同为0,不同为1。
比如11111和10101进行这个位或与操作,结果是01010,经过尝试你会发现: 一个数与一个全是1的数进行位或与操作,结果必然是它本身所有位取反。
因此,等会我们 只需要把我们的数据与一个全是1 的数位或与即可实现取反操作,实现简单的加密操作。
通常,我们都会使用16进制的ff充当这个全是1的数,因为一个f二进制是1111,而两个就是1111 1111,这样八位刚好就是一个字节。所以等会就用 : 数据^0xff 对数据取反加密,0x表示16进制。
2.自定义ClassLoader
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
把自己的类继承ClassLoader然后重写loadClass()方法,最后通过路径加载类就好了 loadclass(String name)。具体的等会看我代码。
3.先对文件加密
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 对文件进行取反加密,生成新的加密文件。该class的目的为encrpt
* @author 王大爷
*
*/
public class 文件取反加密01 {
public static void main(String[] args) {
encrpt("C:\\Users\\王大爷\\Desktop\\java\\java练习\\Helloworld.class" //生成新的加密文件
,"C:\\Users\\王大爷\\Desktop\\java\\java练习\\tem\\Helloworld.class");
}
public static void encrpt(String src,String dest) {
try(InputStream is=new FileInputStream(src);
OutputStream os=new FileOutputStream(dest);) {
int len=-1;
while((len=is.read())