黑马程序员技术交流社区

标题: 自定义类加载器问题 [打印本页]

作者: 工善器    时间: 2014-1-16 16:30
标题: 自定义类加载器问题
  1. package first;
  2. /*题目:
  3. * 就是自己写带有加密功能的类加载器。
  4. * 运行结果:
  5. *
  6. * 用非法索引访问数组时抛出的异常!*/
  7. import java.io.ByteArrayOutputStream;
  8. import java.io.File;
  9. import java.io.FileInputStream;
  10. import java.io.FileNotFoundException;
  11. import java.io.FileOutputStream;
  12. import java.io.IOException;
  13. import java.io.InputStream;
  14. import java.io.OutputStream;
  15. //主类必须继承ClassLoader,才可以直接使用difineClass
  16. public class Test extends ClassLoader {
  17.         // 加密方法
  18.         private static void encrypt(InputStream in, OutputStream out) {
  19.                 int b = -1;
  20.                 try {
  21.                         while ((b = in.read()) != -1) {
  22.                                 out.write(b ^ 0xff);
  23.                         }
  24.                 } catch (IOException e) {
  25.                         // TODO Auto-generated catch block
  26.                         e.printStackTrace();
  27.                 }

  28.         }

  29.         // 私有化一个ClassDir变量
  30.         private String classDir = null;

  31.         public Test() {

  32.         }

  33.         // 不能与类同名,但是有返回值,不是构造函数,那个,,
  34.         public Test(String classDir) {
  35.                 this.classDir = classDir;
  36.         }

  37.         /*
  38.          * classLoader的方法,findclass(String name) 使用指定的二进制名称查找类。返回值:Class<?>
  39.          */

  40.         protected Class<?> findClass(String classname) {
  41.                 // 静态字段separator,返回值是string类型,与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
  42.                 String classPath = classDir + File.separator + classname + ".class";
  43.                 try {
  44.                         FileInputStream fin = new FileInputStream(new File(classPath));
  45.                         // ByteArrayOutputStream byte数组输出流
  46.                         ByteArrayOutputStream bout = new ByteArrayOutputStream();
  47.                         encrypt(fin, bout);
  48.                         encrypt(fin, bout);
  49.                         // 创建一个byte数组,用byte输出流的方法转换直接转换成byte[]
  50.                         byte[] bytes = bout.toByteArray();
  51.                         // 关闭输入流
  52.                         fin.close();
  53.                         // defineClass将bytes数组,转换成Class类的实例。
  54.                         return defineClass(null, bytes, 0, bytes.length);

  55.                 } catch (FileNotFoundException e) {
  56.                         // TODO Auto-generated catch block
  57.                         e.printStackTrace();
  58.                 } catch (IOException e) {
  59.                         // TODO Auto-generated catch block
  60.                         e.printStackTrace();
  61.                 }
  62.                 return null;
  63.         }

  64.         public static void main(String[] args) throws ArrayIndexOutOfBoundsException{
  65.                 String src = args[0];
  66.                 String dest = args[1];
  67.                 // string的 substring方法返回一个新字符串,它是此字符串的一个子字符串。
  68.                 // lastIndexOf方法返回指定子字符串在此字符串中最右边出现处的索引
  69.                 String classFileName = src.substring(src.lastIndexOf('\\') + 1);
  70.                 try {
  71.                         InputStream in = new FileInputStream(src);
  72.                         OutputStream out = new FileOutputStream(dest + "\\" + classFileName);
  73.                         encrypt(in, out);

  74.                 } catch (FileNotFoundException e) {
  75.                         // TODO Auto-generated catch block
  76.                         e.printStackTrace();
  77.                 }

  78.         }

  79. }
复制代码




编译提示:ArrayIndexOutOfBoundsException
我在主函数上,throws异常,还是报错,求大神指点!!


作者: 工善器    时间: 2014-1-16 16:50
是不是因为在向main Method 传递参数时,每个参数的长度有限制!
作者: 工善器    时间: 2014-1-16 16:54
张老师使用类加载器的时候,哪个ClassLoaderAttachment哪个文件是??详解下
作者: 船长    时间: 2014-1-16 22:26
多给你加点分,好好加油!
作者: 快乐的黑马    时间: 2014-1-17 08:27
你的技术分也太快了吧,昨天一看才23,今早一看,妈呀。28了
作者: 工善器    时间: 2014-1-17 20:31
快乐的黑马 发表于 2014-1-17 08:27
你的技术分也太快了吧,昨天一看才23,今早一看,妈呀。28了

连续两天回答的问题分数都加上了,谢谢你的关注!
作者: 快乐的黑马    时间: 2014-1-17 21:15
工善器 发表于 2014-1-17 20:31
连续两天回答的问题分数都加上了,谢谢你的关注!

面试了没?我也够分数了哈哈





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2