黑马程序员--基础加强--第八篇--类加载器

来源:互联网 发布:算法与数据结构自测题 编辑:程序博客网 时间:2024/06/06 07:17
ASP.Net+Android+IOS开发.Net培训期待与您交流!
1类加载器的概念
Java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器为BootStrap,ExtClassLoader,AppClassLoader,每个类加载器管理特殊的位置。类加载器也是Java类,因为其它是Java类的类加载器本身也是被类加载器加载的,显然必须有第一个类加载器不是Java类,这正是BootStrap。
BootStrap                 ------------------------>JRE/Lib/rt.jar
ExtClassloader         ------------------------>JRE/Lib/ext/x,jar
AppClassLoader       ------------------------>CLASSPATH指定的所有jar或目录
MyClassLoader        ------------------------->可以自定义目录

2类加载器的委托加载机制
---从自身到父类,祖宗,再从祖宗到父亲到自身。
---使用自定义的类加载器
3练习,自己编写一个加密文件的类加载器,然后在正常程序下运行,发现出现ClassFormatError错误,中间需要重启eclipse。
package ClassLoader;import java.util.Date;public class ClassLoaderTest {public static void main(String[] args) throws Exception{// TODO Auto-generated method stubSystem.out.println(ClassLoaderTest.class.getClassLoader().getClass().getName());System.out.println(System.class.getClassLoader());//输出为null,为特殊的类加载器System.out.println(new ClassLoaderAttachment().toString());;Class clazz = new MyClassLoader("itcastlib").loadClass("ClassLoaderAttachment");Date d1 = (Date)clazz.newInstance();System.out.println(d1);}}
package ClassLoader;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;public class MyClassLoader extends ClassLoader {public static void main(String[] args)throws IOException {String srcPath = args[0];String destDir = args[1];FileInputStream fis = new FileInputStream(srcPath);String destFilePath = srcPath.substring(srcPath.lastIndexOf('\\')+1);//目的路径String destPath = destDir+"\\"+destFilePath;FileOutputStream fos = new FileOutputStream(destPath);cypher(fis,fos);//加密文件fos.close();//关闭输入输出流fis.close();}private static void cypher(InputStream ips,OutputStream ops)throws IOException{int b = -1;while((b = ips.read())!=-1){ops.write(b ^ 0xff);//文件加密,0变1,1变0}}private String classDir;@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {String classFileName = classDir+"/"+name+".class";try {FileInputStream fis = new FileInputStream(classFileName);ByteArrayOutputStream bos = new ByteArrayOutputStream();//new一个字节数组cypher(fis,bos);fis.close();byte[] bytes = bos.toByteArray();return defineClass(bytes,0,bytes.length);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return super.findClass(name);//该类不能编译的换为父类}public MyClassLoader(){}public MyClassLoader(String classDir){this.classDir = classDir;}}
package ClassLoader;import java.util.Date;public class ClassLoaderAttachment extends Date {public String toString(){//主要使用这里的toString()方法return "hello,itcast";}}
ASP.Net+Android+IOS开发.Net培训期待与您交流!
0 0
原创粉丝点击