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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冰枫 中级黑马   /  2014-4-17 12:13  /  1102 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题:
1.将参数传递给loadClass(),内部会将参数传递给findClass()对吗?
2.下面的代码可以运行,高手帮忙看一下有什么欠缺的地方
-------------------------------------------------------
/*
* 需求:将一个类用自己的类加载器进行加密并加载
*
* 思路:
* 1.首先写一个简单的被操作的类:ClassLoaderAttachment
* 2.然后写自己的加载器:MyClassLoader 此类需要两个值:源文件srcPath和目的目录destDir
*   其中srcPath是包含文件名的决定路径,destDir只包含文件夹名,且为相对路径。所以要得出destPath.
*   通过输入输出流对要操作的类进行加密。
*   要覆盖findClass方法,不能覆盖loadClass方法,他其中的name有被调用后往loadClass方法传入
*   构造方法两个,一个带参数(classDir也就是上面的destDir),一个不带参数
* 3.由ClassLoderTest类调用MyClassLoader,并且将目的目录classDir和要操作的类ClassLoaderAttachment
*   传进去。
* */
public class ClassLoaderTest {
        public static void main(String[] args) throws Exception{
                Class cls = new MyClassLoader("itcastlib").loadClass("ClassLoaderAttachment");
                Date d1 = (Date)cls.newInstance();
                System.out.println(d1);
               
        }
}
-------------------------------------------------------------------------
//我的加载器
public class MyClassLoader extends ClassLoader {
        public static void main(String[] args)throws Exception {
                String srcPath = args[0];
                String destDir = args[1];
                String destPath = destDir+"\\"+srcPath.substring(srcPath.lastIndexOf("\\"));
                FileInputStream fis = new FileInputStream(srcPath);
                FileOutputStream fos = new FileOutputStream(destPath);
                cypher(fis,fos);
                fis.close();
                fos.close();
        }
        private String classDir;
        @Override
        protected Class<?> findClass(String name)
            throws ClassNotFoundException{
                String classFileName = classDir +"\\"+name+".class";
                try {
                        FileInputStream fis = new FileInputStream(classFileName);
                        ByteArrayOutputStream bos = new ByteArrayOutputStream();
                        //将class文件加载进来 进行解密
                        cypher(fis,bos);
                        fis.close();
                        byte[] bytes = bos.toByteArray();
                        return defineClass(bytes,0,bytes.length);
                       
                } catch (Exception e) {
                        e.printStackTrace();
                }
                return super.findClass(name);
        }
        //简单加密,加密和解密都用这一个方法
        private static void cypher(InputStream ips,OutputStream ops)throws Exception{
                int b=-1;
                while((b=ips.read())!=-1){
                        ops.write(b ^ 0xff);
                }       
        }
        //空参数构造方法
        public MyClassLoader(){
        }
        //有参构造方法
        public MyClassLoader(String classDir){
                this.classDir = classDir;       
        }       
}

1 个回复

倒序浏览
接着你的疑问呢。只给代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马