A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 工善器 高级黑马   /  2014-1-16 16:30  /  971 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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异常,还是报错,求大神指点!!

评分

参与人数 1技术分 +1 收起 理由
船长 + 1

查看全部评分

6 个回复

倒序浏览
是不是因为在向main Method 传递参数时,每个参数的长度有限制!

评分

参与人数 1技术分 +1 收起 理由
船长 + 1

查看全部评分

回复 使用道具 举报
张老师使用类加载器的时候,哪个ClassLoaderAttachment哪个文件是??详解下
回复 使用道具 举报
多给你加点分,好好加油!
回复 使用道具 举报
你的技术分也太快了吧,昨天一看才23,今早一看,妈呀。28了
回复 使用道具 举报
快乐的黑马 发表于 2014-1-17 08:27
你的技术分也太快了吧,昨天一看才23,今早一看,妈呀。28了

连续两天回答的问题分数都加上了,谢谢你的关注!
回复 使用道具 举报
工善器 发表于 2014-1-17 20:31
连续两天回答的问题分数都加上了,谢谢你的关注!

面试了没?我也够分数了哈哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马