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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 骑上最爱 中级黑马   /  2013-6-1 10:51  /  1492 人查看  /  2 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

类加载器以及类加载器的使用,请有经验的朋友分享下。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

2 个回复

倒序浏览
额,我把自己的视频学习笔记贴出来,别介意哦,只求一技术分,你懂的:'(
  1. 注:类加载中如果类A引用到了类B(如 A继承B,A中New B()),是用加载类A的类加载器去加载类B!


  2. 获取一个类的加载器的名称的方法
  3. 如获取:ClassLoaderTest的加载器的名称的方法
  4. ClassLoaderTest.class.getClassLoader().getClass().getName()


  5. 自定义类加载器(继承ClassLoader,重写findClass()方法,loadClass保存了类加载器的委托机制,所有最好不要重写loadclass方法,在类加载器中如果loadclass找不到类会调用findclass方法继续查找)
  6. public class MyClassLoader extends ClassLoader{

  7.         /**
  8.          * @param args
  9.          */
  10.         public static void main(String[] args) throws Exception {
  11.                 // TODO Auto-generated method stub
  12.                 String srcPath = args[0];
  13.                 String destDir = args[1];
  14.                 FileInputStream fis = new FileInputStream(srcPath);
  15.                 String destFileName = srcPath.substring(srcPath.lastIndexOf('\\')+1);
  16.                 String destPath = destDir + "\\" + destFileName;
  17.                 FileOutputStream fos = new FileOutputStream(destPath);
  18.                 cypher(fis,fos);
  19.                 fis.close();
  20.                 fos.close();
  21.         }
  22.        
  23.         private static void cypher(InputStream ips ,OutputStream ops) throws Exception{
  24.                 int b = -1;
  25.                 while((b=ips.read())!=-1){
  26.                         ops.write(b ^ 0xff);
  27.                 }
  28.         }

  29.         private String classDir;

  30.         //必须重写findClass方法
  31.         @Override
  32.         protected Class<?> findClass(String name) throws ClassNotFoundException {
  33.                 // TODO Auto-generated method stub
  34.                 String classFileName = classDir + "\\"  + name.substring(name.lastIndexOf('.')+1) + ".class";
  35.                 try {
  36.                         FileInputStream fis = new FileInputStream(classFileName);
  37.                         ByteArrayOutputStream  bos = new ByteArrayOutputStream();
  38.                         cypher(fis,bos);
  39.                         fis.close();
  40.                         System.out.println("aaa");
  41.                         byte[] bytes = bos.toByteArray();
  42.                         return defineClass(bytes, 0, bytes.length);
  43.                 } catch (Exception e) {
  44.                         // TODO Auto-generated catch block
  45.                         e.printStackTrace();
  46.                 }
  47.                 return null;
  48.         }
  49.        
  50.         public MyClassLoader(){
  51.                
  52.         }
  53.        
  54.         public MyClassLoader(String classDir){
  55.                 this.classDir = classDir;
  56.         }
  57. }

  58. 调用方法:
  59. Class clazz = new MyClassLoader("itcastlib").loadClass("cn.itcast.day2.ClassLoaderAttachment");
  60. Date d1 =  (Date)clazz.newInstance();
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马