【自己动手写类加载器2】覆盖findClass(String name)方法,删除bin目录下的加密的class文件
2014-03-30 11:04
615 查看
1、要想实现自己的类加载器能够加载类,需要覆盖findClass(String name)方法,类加载器的loadClass(String name)方法最终调用的还是findClass(String name)。
2、由于类加载器使用的委托机制,先看父类AppClassLoader能不能加载再看自己的类加载器能不能加载,所以要把bin目录下的class文件删掉。
下面是自己写的类加载器,具有加密功能
运行结果
把加密的class复制到原class目录下
运行程序:
找到需要类加载器需要加载的类,敲一个回车,保存一下,生成新的class文件
再次运行
再次把这个新生出的class文件删了
再次运行
2、由于类加载器使用的委托机制,先看父类AppClassLoader能不能加载再看自己的类加载器能不能加载,所以要把bin目录下的class文件删掉。
下面是自己写的类加载器,具有加密功能
package com.xiaozhi.myclassloader; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; public class MyClassLoader extends ClassLoader{ public static void main(String[] args) throws Exception{//生成加密字节码文件 String srcPath = args[0]; String destPah = args[1]; String fileName = srcPath.substring(srcPath.lastIndexOf("\\") + 1); destPah = destPah +"\\"+fileName; FileInputStream fileInputStream = new FileInputStream(srcPath); FileOutputStream fileOutputStream = new FileOutputStream(destPah); encrypt(fileInputStream, fileOutputStream); fileInputStream.close(); fileOutputStream.close(); } private String classDir; public MyClassLoader(){ } public MyClassLoader(String classDir){ this.classDir=classDir; } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { String classFileName =classDir+"\\"+name.substring(name.lastIndexOf('.')+1)+".class"; try { FileInputStream fileInputStream = new FileInputStream(classFileName); ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); encrypt(fileInputStream, arrayOutputStream); fileInputStream.close(); byte[] bytes = arrayOutputStream.toByteArray(); return defineClass(bytes, 0, bytes.length); } catch (Exception e) { e.printStackTrace(); } return super.findClass(name); } public static void encrypt(InputStream inputStream,OutputStream outputStream) throws Exception { int b = 0; while((b=inputStream.read())!=-1) { outputStream.write(b^0xff); outputStream.flush(); } } }类加载器需要加载的类,继承于Date,
package com.xiaozhi.myclassloader; import java.util.Date; public class ClassLoaderAttachment extends Date{ @Override public String toString() { return "hello heima"; } }测试类
package com.xiaozhi.testmyclassloader; import java.util.Date; import com.xiaozhi.myclassloader.MyClassLoader; public class Test { public static void main(String[] args) throws Exception{ Class clazz=new MyClassLoader("mylib").loadClass("com.xiaozhi.myclassloader.ClassLoaderAttachment"); // ClassLoaderAttachment loaderAttachment= (ClassLoaderAttachment) clazz.newInstance();//这里不能这样写,因为class文件已经删除,编译器找不到Class文件。 Date date=(Date) clazz.newInstance(); System.out.println(date); } }
运行结果
把加密的class复制到原class目录下
运行程序:
找到需要类加载器需要加载的类,敲一个回车,保存一下,生成新的class文件
再次运行
再次把这个新生出的class文件删了
再次运行
相关文章推荐
- 【自己动手写类加载器1】实现加密功能:生成加密class文件,复制到bin目录下,AppClassLoader加载出错
- 转: 实现自己的类加载时,重写方法loadClass与findClass的区别
- Class.forName(String name)方法,到底会触发那个类加载器进行类加载行为?
- 实现自己的类加载时,重写方法loadClass与findClass的区别
- Java--对于 class文件进行加密 然后通过我们自己写的类加载器进行加载指定类
- Java--对于 class文件进行加密 然后通过我们自己写的类加载器进行加载指定类
- 实现自己的类加载时,重写方法loadClass与findClass的区别
- linux 利用find进行批量删除CVS目录和文件的方法
- 实现自己的类加载时,重写方法loadClass与findClass的区别
- day20File类,各方法。递归。删除一带内容的目录。Properties 。记录应用程序运行次数。打印流。切割合并文件。
- liunx 中 find常见用法示例 / linux下递归删除目录下所有asp文件
- php遍历删除整个目录及文件的方法
- Class.forName(String driverClassName)加载JDBC驱动程序时,底层都做了些什么???
- java常用方法之遍历目录,删除指定文件
- thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
- js原生封装getClassName()方法-ie不支持getElementsByClassName,所以要自己实现获取类名为className的所有元素
- 递归的一些方法使用:深度遍历路径中的所有文件和目录,删除一个有文件的文件夹
- 用递归方法删除文件夹目录及文件
- File,把指定的目录下的所有文件和文件夹删除的方法
- mybatis-spring不能加载属性文件内容报:Cannot load JDBC driver class ${jdbc.driverClassName}'