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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡建彪 黑马帝   /  2012-10-10 10:34  /  1099 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

自定义的类加载器总是搞不清楚 findClass() 这个方法是什么时候执行的?代码如下
package com.hu.ClassLoader;
/*
* 测试类,然后自定义的类加载器去 加载该类
*/
public class ClassTest implements InterfaceTest{
   
     @Override
    public void name() {
     System.out.println("tao");
     }
   
    @Override
    public void age() {
    System.out.println("21");
    }
}

package com.hu.ClassLoader;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class MyClaLoader extends ClassLoader{
   
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        try {
                 //需要加载的.class字节码的位置
                 String classPath="D:\\IOstream\\ClassTest.class";
                 
                 FileInputStream fis=new FileInputStream(classPath);
                 ByteArrayOutputStream bos=new ByteArrayOutputStream();
                 cypher(fis, bos);
                 fis.close();
                 byte[] bytes=bos.toByteArray();
                 return defineClass(bytes, 0, bytes.length);
             } catch (FileNotFoundException e) {
             e.printStackTrace();
             } catch (IOException e) {
                 e.printStackTrace();
             }
             return super.findClass(name);
         }
         
         //相应的字节码解密类,在加载E盘根目录下的被加密过的ClassTest.class字节码的时候,进行相应的解密。
     private static void cypher(InputStream in,OutputStream out) throws IOException{
             int b=-1;
             while((b=in.read())!=-1){
                 out.write(b^0xff);
             }
         }
         
     public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
                  Class clazz=new MyClaLoader().loadClass("com.hu.ClassLoader");
                     //这就是我们接口的作用。如果没有接口,就需要利用反射来实现了。
                      InterfaceTest classTest=(InterfaceTest) clazz.newInstance();
                  classTest.name();
                  classTest.age();
              }
}
第二个问题: new MyClaLoader().loadClass("com.hu.ClassLoader"); 后面com.hu.ClassLoader 可以随便改的,写成 a 都行,这个字符串表示什么意思啊?


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马