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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨兴庭 于 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. }
复制代码
疑问在调用类加载的代码里,麻烦大家帮我看看.

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

12 个回复

倒序浏览
如果用ClassLoaderAttachment来创建对象,就需要加载ClassLoaderAttachment这个类的字节码,但是这个类是被加密了的,所以无法使用。那么只能用其父类了。
回复 使用道具 举报
王靖远 发表于 2013-7-7 14:22
如果用ClassLoaderAttachment来创建对象,就需要加载ClassLoaderAttachment这个类的字节码,但是这个类是被 ...

一语点醒梦中人!!明白了!!想了两天没想明白,十分感谢,我还以为其他什么原因呢,把加密的问题给忘记了,谢谢!
回复 使用道具 举报

我顶
必须顶
不得不顶
用尽全力顶
回复 使用道具 举报
再加上千斤顶
总之把它顶到顶
接着使出葵花宝顶
就算顶到史前也要顶
回复 使用道具 举报
老子看了会用道德经顶
孔子亲自拜你为师天天顶
秦始皇站在阿房宫上使劲顶
汉高祖挥师杀向东罗马为你顶
回复 使用道具 举报
枫儿 金牌黑马 2013-11-8 08:15:25
7#
吕布抛弃了貂禅而选择了帮你顶
张三丰见了后用太极拳九式全力顶
左冷禅召开武林盟主大会商讨如何顶
西门吹雪从此学会了最强一招剑神一顶
回复 使用道具 举报
枫儿 金牌黑马 2013-11-8 08:15:37
8#
龙剑飞的如来神掌最后一式改为万佛朝顶
陆小凤从此再也不管闲事了而专门来为你顶
四大名捕四面出击看天下还有没有人敢不在顶
顶到阎罗王说我制造噪音我刁根烟看看他继续顶
回复 使用道具 举报
枫儿 金牌黑马 2013-11-8 08:15:50
9#
顶到火山喷发太平洋海啸我还要继续往死里顶
顶到益阳地震山崩地裂地下水泛滥我还要顶
顶到地下水喷发造成洪灾损失惨重我也顶
要是你觉得敢兴趣你也可以过来一起顶
回复 使用道具 举报
要是你看我不爽我没办法还要继续顶
要是警察敢过来阻止我就更加要顶
要是别人见了骂我傻我还是要顶
要是踩到我脚骨折我也继续顶
回复 使用道具 举报
要是地面凹了我不管继续顶
要是天真塌下来了继续顶
就算天塌下来我都要顶
就算腾讯倒闭也要顶
回复 使用道具 举报
就算鞋子烂也要顶
我用尽全力去顶
我非常用力顶
回复 使用道具 举报
我很用力顶
我用力顶
我再顶
我顶
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马