Java基础加强总结(4)(类加载器)
2011-10-02 22:22
344 查看
一、类加载器
加载类的工具
Java虚拟机提供了三个类加载器:
BootStrap:(C++实现的嵌在JVM内核里)-----jre/lib/rt.jar
ExtClassLoader:(Java类)-----jre/lib/ext/*.jar
AppClassLoader:(Java类)-----classPath指定的所有jar或目录
类加载器的委托机制
当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
首先当前线程的类加载器去加载线程中的第一个类。
如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器来加载类B。
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
每个类加载器加载类时,又先委托给其上级类加载器。
当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是在去找发起者类加载器的儿子。
模板方法设计模式
loadClass(加载类)---->findClass(找到类)---->definClass(得到class文件转换成字节码)
用自定义类加载器加载加密过的字节码文件
加载类的工具
Java虚拟机提供了三个类加载器:
BootStrap:(C++实现的嵌在JVM内核里)-----jre/lib/rt.jar
ExtClassLoader:(Java类)-----jre/lib/ext/*.jar
AppClassLoader:(Java类)-----classPath指定的所有jar或目录
类加载器的委托机制
当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
首先当前线程的类加载器去加载线程中的第一个类。
如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器来加载类B。
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
每个类加载器加载类时,又先委托给其上级类加载器。
当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是在去找发起者类加载器的儿子。
模板方法设计模式
loadClass(加载类)---->findClass(找到类)---->definClass(得到class文件转换成字节码)
用自定义类加载器加载加密过的字节码文件
package day3; import java.util.Date; public class ClassLoaderAttachment extends Date { public String toSting(){ return "hello,itcast"; } }
package day3; 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{ static String destDir = null; MyClassLoader(String destDir){ this.destDir = destDir; } public static void main(String[] args) throws Exception{ String srcPath = args[0]; destDir = args[1]; inout(srcPath, destDir); ClassLoaderAttachment a = new ClassLoaderAttachment(); System.out.println(a.toSting()); } private static void inout(String srcPath, String destDir) throws FileNotFoundException, Exception, IOException { FileInputStream fis = new FileInputStream(srcPath); String destFileName = srcPath.substring(srcPath.lastIndexOf('\\')+1); String destPath = destDir + "\\" + destFileName; FileOutputStream fos = new FileOutputStream(destPath); cypher(fis,fos); fis.close(); fos.close(); } private static void cypher(InputStream ips,OutputStream ops) throws Exception{ int b = -1; while((b=ips.read())!=-1){ ops.write(b ^ 0xff); } } @Override protected Class<?> findClass(String name) throws ClassNotFoundException{ String classFileName = destDir +"\\" +name + ".class"; try { FileInputStream fis = new FileInputStream(classFileName); ByteArrayOutputStream bos = new ByteArrayOutputStream(); cypher(fis,bos); fis.close(); } catch (Exception e) { e.printStackTrace(); } return super.findClass(name); } }
package day3; import java.util.Date; public class TestDemo { public static void main(String[] args) throws Exception{ Class clazz = new MyClassLoader("itcastlib").loadClass("day3.ClassLoaderAttachment"); Date d1 = (Date)clazz.newInstance(); System.out.println(d1); } }
相关文章推荐
- 黑马程序员__JAVA基础加强--类加载器和代理总结
- Java基础加强之类加载器
- Java基础加强总结(1)
- 黑马程序员--Java基础加强总结
- Java基础加强总结之动态代理(Proxy)
- Java基础加强总结(一)——注解(Annotation)
- Java基础加强总结(二)——泛型
- 黑马程序员-JAVA基础加强之类加载器
- 黑马程序员之Java基础加强之类加载器
- Java基础加强总结——代理(Proxy)
- 黑马程序员--Java基础加强--16.利用反射操作泛型V【通过Constructor反射解析泛型构造方法】【通过Field反射解析泛型成员变量】【个人总结】
- 黑马程序员__关于学习Java基础加强的总结_2
- 黑马程序员----------java基础加强之hashSet总结
- 黑马程序员--Java基础加强--02.代码简化 书写规律I_原始数据类型【重载】【多态】【泛型】【泛型限定】【个人总结】
- 黑马程序员--Java基础加强--04.代码简化 书写规律III_数组参数【重载】【数组】【可变参数数组】【泛型可变参数数组】【个人总结】
- java基础加强--要点总结2
- 黑马程序员--Java基础加强--06.【泛型通配符限定】【个人总结】
- 黑马程序员--Java基础加强--09.【MyEclipse的class文件所在的目录配置】【相对路径解析】【个人总结】
- Java基础加强总结(一)——注解(Annotation)
- 这是我在四天内听完陈老师讲的java基础加强后的总结