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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 谢洋 于 2013-3-15 08:00 编辑
  1. public class ClassLoaderTest {

  2. public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

  3. //通过自定义的类加载器MyClassLoader,将在itcast目录下加载名称为ClassLoaderAttachment的类,老父找得着.
  4. <FONT style="BACKGROUND-COLOR: yellow">//注意:我这里我是新建一的个包,测试时,记得根据实际来修改
  5. </FONT>Class clazz = new MyClassLoader<FONT style="BACKGROUND-COLOR: yellow">("itcastlib2").</FONT>loadClass<FONT style="BACKGROUND-COLOR: yellow">("cn.classloader.ClassLoaderAttachment");
  6. </FONT>
  7. //打印加载该类是那个加载器。
  8. System.out.println(clazz.getClassLoader().getClass().getName());
  9. System.out.println(clazz.getName());//被加载的类
  10. System.out.println("xxxxxxxx");
  11. }
  12. }
复制代码
  1. public class MyClassLoader extends ClassLoader {

  2. public static void main(String[] args) throws Exception {

  3. String srcPath = args[0];
  4. String destDir = args[1];
  5. FileInputStream fis = new FileInputStream(srcPath);
  6. System.out.println(srcPath);
  7. System.out.println(destDir);
  8. //得到输入文件名称
  9. String destFileName = srcPath.substring(srcPath.lastIndexOf("\\")+1);
  10. System.out.println(destFileName);
  11. //得到文件要存入到的路径
  12. String destPath = destDir +"\\"+destFileName;
  13. System.out.println(destPath);
  14. //生产一个文件输出流,并关联到destPath
  15. FileOutputStream fos = new FileOutputStream(destPath);

  16. <FONT style="BACKGROUND-COLOR: yellow">//copy(fis,fos);//复制文件到itcastlib2中不加密,采用没解密的加载,不行,解
  17. cypher(fis,fos);//采用加密的加载</FONT>
  18. fis.close();
  19. fos.close();
  20. }

  21. //复制
  22. private static void copy(InputStream ips,OutputStream ops) throws Exception{
  23. int b = -1;
  24. System.out.println("copy");
  25. while((b=ips.read())!=-1){
  26. ops.write(b);
  27. }
  28. }
  29. //加密方法///
  30. private static void cypher(InputStream ips,OutputStream ops) throws Exception{
  31. int b = -1;
  32. while((b=ips.read())!=-1){
  33. ops.write(b^0xff);
  34. }
  35. }

  36. private String classDir;
  37. //构造这个类时,把指定的目录itcastlib传入,这样就指定了该classLoader那那个目录上去找要加载的类了。
  38. public MyClassLoader(String classDir){
  39. this.classDir = classDir;
  40. }
  41. /**
  42. * loadClass()方法会调用该方
  43. * 自定义的加载器必须复写
  44. * findClass()
  45. */

  46. @Override//<FONT style="BACKGROUND-COLOR: yellow">当父类找不到才会执行这里</FONT>
  47. protected Class<?> findClass(String name) throws ClassNotFoundException {
  48. //目录加上类的名称
  49. //把classFileName改为itcastlib\ClassLoaderAttachment,子类才能找到
  50. String classFileName=classDir +"\\"+ name.substring(name.lastIndexOf('.')+1) + ".class"; //itcast\ClassLoaderAttachment

  51. //String classFileName=classDir +"\\"+ name + ".class";
  52. <FONT style="BACKGROUND-COLOR: yellow">System.out.println(classFileName);//打印被加载的类,走到这能看到正确找到所要加载的了
  53. System.out.println("zi zhao");//查看是否是子类找,</FONT>
  54. try{
  55. //把要加载的类关联到流上
  56. FileInputStream fis = new FileInputStream(classFileName);
  57. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  58. <FONT style="BACKGROUND-COLOR: yellow">//因为本例中itcastlib2中的类是过加载必的,所以在此要解密
  59. //cypher(fis,bos);//注释传入一个不加密的,不行,FormatError
  60. cypher(fis,bos);//传入不加密的且时行解密也不行,Incompatible magic value 889275713 in class file
  61. //为什么一旦采用加载不加密的类时,不管解不解密,都运行不了?
  62. </FONT>//直接把父类能正常加载那一份(没加密过的)给子类(通过不解密的方式)加载也是不行?

  63. fis.close();
  64. byte[] bytes = bos.toByteArray();
  65. //得到一个Class 实例
  66. return defineClass(bytes,0,bytes.length);
  67. //return defineClass(name,bytes,0,bytes.length);
  68. }catch(Exception e){
  69. e.printStackTrace();
  70. }
  71. return null;
  72. }

  73. }

复制代码
上面代码如果和张老师那样,父类加载不加密的类,子类加载经过加密后再解密的方式加载都可以执行,
但我直接把不加密的类copy给子类加载时(所加载类没有加密所以不解密,即使解密也不行),就发生异常了FormatError和Incompatible magic value 889275713 in class file,懂得帮忙解决一下,搞了一天都没搞懂问题出现在哪?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

倒序浏览
没有人回答????
回复 使用道具 举报
找不出来 等待下一位来解答了 过两天再来看看
回复 使用道具 举报
66//cypher(fis,bos);//注释传入一个不加密的,不行,FormatError 如果注释掉cypher(fis,bos),就需要加上copy(fis,bos).不然bos=null,会报ClassFormatError
67cypher(fis,bos);//传入不加密的且时行解密也不行,Incompatible magic value 889275713 in class file

大半夜的做实验 终于找到了 。。。。

评分

参与人数 1黑马币 +30 收起 理由
谢洋 + 30 很给力!

查看全部评分

回复 使用道具 举报
黑马李超 发表于 2013-3-15 03:34
66//cypher(fis,bos);//注释传入一个不加密的,不行,FormatError 如果注释掉cypher(fis,bos),就需要加上cop ...

谢谢了,null都不报空异常
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马