黑马程序员技术交流社区

标题: 关于张孝祥老师高新技术ClassLoader类加载器部分的问题 [打印本页]

作者: taomingking    时间: 2013-7-6 22:10
标题: 关于张孝祥老师高新技术ClassLoader类加载器部分的问题
本帖最后由 杨兴庭 于 2013-7-7 23:11 编辑

直接上代码,问题在代码里,先上类加载器
  1. package study.day2;
  2. import java.io.*;
  3. import com.sun.beans.finder.ClassFinder;

  4. public class MyClassLoader extends ClassLoader{
  5.         /**
  6.          * @param args
  7.          */
  8.         public static void main(String[] args) throws Exception {
  9.                 String srcPath = args[0];
  10.                 String destDir = args[1];
  11.                 FileInputStream fis = new FileInputStream(srcPath);
  12.                 String destFileName = srcPath.substring(srcPath.lastIndexOf('\\'));
  13.                 String destPath = destDir+destFileName;
  14.                 FileOutputStream fos = new FileOutputStream(destPath);
  15.                 cypher(fis,fos);
  16.                 fis.close();
  17.                 fos.close();
  18.         }
  19.         //加密方法
  20.         public static void cypher(InputStream fis, OutputStream fos) throws Exception {
  21.                 int b = -1;
  22.                 while((b=fis.read())!=-1){
  23.                         fos.write(b ^ 0xff);
  24.                 }
  25.         }
  26.         private String classDir;
  27.         @Override
  28.         protected Class<?> findClass(String name) throws ClassNotFoundException {
  29.                 String classFileName = classDir+"\\"+name.substring(name.lastIndexOf('.')+1)+".class";
  30.                 try {
  31.                         System.out.println("It's MyClassLoader.");
  32.                         FileInputStream fis = new FileInputStream(classFileName);
  33.                         ByteArrayOutputStream bos = new ByteArrayOutputStream();
  34.                         cypher(fis,bos);
  35.                         byte[] bys = bos.toByteArray();
  36.                         return defineClass(null, bys, 0,bys.length);                        
  37.                 }
  38.                 catch (Exception e) {
  39.                         e.printStackTrace();
  40.                 }
  41.                 return super.findClass(name);
  42.         }
  43.         public MyClassLoader(String classDir){
  44.                 this.classDir = classDir;
  45.         }
  46. }
复制代码
调用类加载器的代码
  1. package study.day2;
  2. import java.util.Date;
  3. public class ClassLoderTest {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) throws Exception {
  8.                 /*
  9.                 System.out.println(ClassLoderTest.class.getClassLoader().getClass().getName());
  10.                 System.out.println(System.class.getClassLoader());
  11.                
  12.                 ClassLoader loader = ClassLoader.class.getClassLoader();
  13.                 while(loader!=null){
  14.                         System.out.println(loader.getClass().getName());
  15.                         loader = loader.getParent();
  16.                 }
  17.                 System.out.println(loader);        
  18.                 //System.out.println(new ClassLoaderAttachment().toString());
  19.                 */
  20.                 //问题在这里,看这里,看这里!!
  21.                 Class clazz = new MyClassLoader("itcastlib").loadClass("study.day2.ClassLoaderAttachment");//这里我明明是获取的ClassLoaderAttachment的字节码?
  22.                 Date dd = (Date) clazz.newInstance();//但是这里却要用ClassLoaderAttachment的父类来引用和强转,不明白其中的道理,求大家帮助
  23.                 System.out.println(dd);
  24.         }
  25. }
复制代码
类加载需要加载的类的代码
  1. package study.day2;

  2. import java.util.Date;
  3. public class ClassLoaderAttachment extends Date {        
  4.         @Override
  5.         public String toString() {
  6.                 return "hello,itcast";
  7.         }        
  8. }
复制代码
疑问在调用类加载的代码里,麻烦大家帮我看看.
作者: 王靖远    时间: 2013-7-7 14:22
如果用ClassLoaderAttachment来创建对象,就需要加载ClassLoaderAttachment这个类的字节码,但是这个类是被加密了的,所以无法使用。那么只能用其父类了。
作者: taomingking    时间: 2013-7-7 23:01
王靖远 发表于 2013-7-7 14:22
如果用ClassLoaderAttachment来创建对象,就需要加载ClassLoaderAttachment这个类的字节码,但是这个类是被 ...

一语点醒梦中人!!明白了!!想了两天没想明白,十分感谢,我还以为其他什么原因呢,把加密的问题给忘记了,谢谢!
作者: 枫儿    时间: 2013-11-8 08:14

我顶
必须顶
不得不顶
用尽全力顶
作者: 枫儿    时间: 2013-11-8 08:15
再加上千斤顶
总之把它顶到顶
接着使出葵花宝顶
就算顶到史前也要顶
作者: 枫儿    时间: 2013-11-8 08:15
老子看了会用道德经顶
孔子亲自拜你为师天天顶
秦始皇站在阿房宫上使劲顶
汉高祖挥师杀向东罗马为你顶
作者: 枫儿    时间: 2013-11-8 08:15
吕布抛弃了貂禅而选择了帮你顶
张三丰见了后用太极拳九式全力顶
左冷禅召开武林盟主大会商讨如何顶
西门吹雪从此学会了最强一招剑神一顶
作者: 枫儿    时间: 2013-11-8 08:15
龙剑飞的如来神掌最后一式改为万佛朝顶
陆小凤从此再也不管闲事了而专门来为你顶
四大名捕四面出击看天下还有没有人敢不在顶
顶到阎罗王说我制造噪音我刁根烟看看他继续顶
作者: 枫儿    时间: 2013-11-8 08:15
顶到火山喷发太平洋海啸我还要继续往死里顶
顶到益阳地震山崩地裂地下水泛滥我还要顶
顶到地下水喷发造成洪灾损失惨重我也顶
要是你觉得敢兴趣你也可以过来一起顶

作者: 枫儿    时间: 2013-11-8 08:16
要是你看我不爽我没办法还要继续顶
要是警察敢过来阻止我就更加要顶
要是别人见了骂我傻我还是要顶
要是踩到我脚骨折我也继续顶
作者: 枫儿    时间: 2013-11-8 08:16
要是地面凹了我不管继续顶
要是天真塌下来了继续顶
就算天塌下来我都要顶
就算腾讯倒闭也要顶
作者: 枫儿    时间: 2013-11-8 08:16
就算鞋子烂也要顶
我用尽全力去顶
我非常用力顶

作者: 枫儿    时间: 2013-11-8 08:16
我很用力顶
我用力顶
我再顶
我顶





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