黑马程序员技术交流社区

标题: 类加载器及加密问题 [打印本页]

作者: lichao    时间: 2013-11-22 11:22
标题: 类加载器及加密问题
  1. import java.util.Date;

  2. public class ClassLoaderTest {

  3.         /**
  4.          * @param args
  5.          * @throws ClassNotFoundException
  6.          * @throws IllegalAccessException
  7.          * @throws InstantiationException
  8.          */
  9.         public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
  10.                 // TODO Auto-generated method stub
  11.                 Class clazz=new MyClassLoader("xiaodai").loadClass("ClassLoaderDai");//问题为什么这里不调用findClass()函数呢?而调用                                                      
  12.                 Date date=(Date)clazz.newInstance();                                                        //
  13. loaderClass ()方法呢?调用父类的
  14. loaderClass 方法

  15.                 System.out.println(date);                                                                              //何将”ClassLoaderDai“传给子类的呢?子类有如何用的
  16.         }                                                                                                                     //呢?

  17. }
复制代码
  1. import java.io.ByteArrayOutputStream;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;

  8. public class MyClassLoader extends ClassLoader{

  9.         /**
  10.          * @param args
  11.          * @throws IOException
  12.          */
  13.         public static void main(String[] args) throws IOException {
  14.                 // TODO Auto-generated method stub
  15.                 String readFile=args[0];
  16.                 String writefiles=args[1];
  17.                 String file=readFile.substring(readFile.lastIndexOf("\\")+1);
  18.                 String writefile=writefiles+"\\"+file;
  19.                 InputStream is=new FileInputStream(readFile);
  20.                 OutputStream os=new FileOutputStream(writefile);
  21.                 cyper(is,os);
  22.                 is.close();
  23.                 os.close();
  24.         }
  25.         public static void cyper(InputStream is,OutputStream os) throws IOException{
  26.                 int ips=-1;
  27.                 while((ips=is.read())!=-1){
  28.                         os.write(ips^0xff);
  29.                        
  30.                 }
  31.                
  32.         }
  33.                 @Override
  34.                 protected java.lang.Class<?> findClass(String name) throws ClassNotFoundException {
  35.                         String readFile=classpaty+"\\"+name+".class";
  36.                         try {
  37.                                 InputStream is=new FileInputStream(readFile);
  38.                                 ByteArrayOutputStream os=new ByteArrayOutputStream();
  39.                                 cyper(is,os);
  40.                                 is.close();
  41.                                 byte[] b=os.toByteArray();
  42.                                 return defineClass(b, 0, b.length);
  43.                         } catch (Exception e) {
  44.                                 // TODO Auto-generated catch block
  45.                                 e.printStackTrace();
  46.                         }
  47.                         return null;
  48.                        
  49.                 }
  50.                
  51.                 private String classpaty;
  52.                 MyClassLoader(){
  53.                        
  54.                 }
  55.                 MyClassLoader(String classpaty){
  56.                         this.classpaty=classpaty;
  57.                 }
  58. }       
复制代码
  1. import java.util.Date;

  2. public class ClassLoaderDai extends Date {
  3.         public String toString(){
  4.                 return "hello java";
  5.         }

  6. }
复制代码

作者: ysunday    时间: 2013-11-22 21:37
这是个模板设计模式,就是说loadClass()里边的代码是固定的了,流程已经规定好了,但是只有findClass()这个方法呢,对不同的子类有不同的处理方式,其余的loadClass都是一样的,所以如果是自己定义的子类呢,需要写一下,如果在规定的流程内,没找到你要加载的类,就会调用findClass.是内部调用的,当然你可以手动调用,但是很麻烦。
”ClassLoaderDai“这个你不是调用了吗?这里Class clazz=new MyClassLoader("xiaodai").loadClass("ClassLoaderDai");
父类没有找到你要加载的类,就会调用findClass呗,然后你看这里
57行
MyClassLoader(String classpaty){
                        this.classpaty=classpaty;
                }
把 “xiaodai”路径传进去。
然后这里
protected java.lang.Class<?> findClass(String name) throws ClassNotFoundException {
                        String readFile=classpaty+"\\"+name+".class";
你不是也把类名ClassLoaderDai通过loadClass()--->传给findClass()这个函数了吗
之后的代码自己看下把。
其实我也没怎么看懂这块,这都是我猜的。仅供参考







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