本帖最后由 张洪慊 于 2013-7-26 21:11 编辑
关于自定义类加载器与加密解密过程中关于defineClass问题:
1.先自定义了一个类(EncryptClass.java)用于加密与解密测试:- package com.itheima.day5;
- import java.util.Date;
- public class EncryptClass extends Date {
- @Override
- public String toString(){
- return "success";
- }
- }
复制代码 2.按高新视频上的简单的^0xff进行加密与解密,加密后的EncryptClass.class放在myEncryptClass文件夹下,在运行前反复确认已删除掉 bin/com/itheima/day5 下的EncryptClass.class文件.- <p>package com.itheima.day5;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.io.File;
- public class CustomClassLoader extends ClassLoader{
- /**
- * @param args;
- */
- public static void main(String[] args)throws Exception {
- // TODO Auto-generated method stub
- //args[0]作为源路径,args[1]作为目的路径
- //我把加密和解密在同一个main中执行,在运行加密后注释掉 防止在删除bin下的EncryptClass后,由于找不到文件会报
- //FileNotFoundException
- /* File file=new File(args[0]);
- FileInputStream fis=new FileInputStream(file);
- FileOutputStream fos=new FileOutputStream(args[1]+"\\\\"+file.getName());
- encryptClass(fis,fos);
- fis.close();
- fos.close();
- */
- Class cls=new CustomClassLoader("myEncryptClass").findClass("EncryptClass");
- System.out.println(cls.newInstance().toString());
-
- }
-
- //简单加密
- public static void encryptClass(InputStream in,OutputStream os)throws IOException{
- int aByte=0;
- while((aByte=in.read())!=-1){
- os.write(aByte^0xff);//最简单的加密->.class中的每个字节^255
- }
- }
-
-
- private String classDir;
-
- public CustomClassLoader(String classDir) {
- super();
- this.classDir = classDir;
- }
- @Override</p><p>public Class<?> findClass(String name)throws ClassNotFoundException{
- String path=classDir+"\\"+name+".class";
- File file=new File(path);
- FileInputStream fis=null;
- byte[] byteArr=new byte[1024];
- int aByte=0;
- int pointer=0;
- try{
- fis=new FileInputStream(file.getAbsolutePath());
-
- while((aByte=fis.read())!=-1)
- byteArr[pointer++]=(byte)(aByte ^ 255);//解密
- }
- catch(Exception e){
- e.printStackTrace();
- }
- finally{
- if(fis!=null)
- try{
- fis.close();
- }
- catch(Exception e){
- e.printStackTrace();
- }
- }
- return defineClass(name,byteArr,0,pointer);
- }
-
- }
- </p>
复制代码 defineClass(name,byteArr,0,pointer);会报 (该包下该类已删除)
视频中用的过时的没有name形参.
但是如果我defineClass(null,byteArr,0,pointer)成功:
那么这个name到底代表什么含义?是不是要查找的类?还是根据字节码新生成的类?
在很久以前有一个这样的问题,我都看了,没有彻底解决http://bbs.itheima.com/thread-13476-1-1.html
麻烦各位同学了.
|