Java基础加强总结(4)(类加载器)
来源:互联网 发布:win10装mac系统 编辑:程序博客网 时间:2024/06/11 06:01
一、类加载器
加载类的工具
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);}}@Overrideprotected 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基础加强总结(4)(类加载器)
- java基础加强5--类加载器
- java基础加强--类加载器
- Java基础加强---ClassLoader(类加载器)
- JAVA--基础加强_类加载器
- java基础加强04 类加载器
- Java 基础加强 - 类加载器
- java基础加强_05_类加载器
- java基础加强_类加载器
- java基础加强(类加载器)
- 基础加强-类加载器
- (21)基础加强-泛型加强-类加载器加强
- 黑马程序员-JAVA基础加强-类加载器
- 黑马程序员 java基础加强_类加载器
- Java基础加强<三>_类加载器、代理
- 【黑马程序员】java基础加强---------类加载器(classLoader)
- 【黑马程序员】Java基础加强17:类加载器ClassLoader
- 基础加强____【Java类加载器 & "委托机制"】
- Linux内核调试 - 一般人儿我都不告诉他(一)
- 多态运行期的行为 --(晚绑定)
- 程序员面试攻略读书笔记
- [altera MegaFunction] RAM-1 Port IP的使用
- SQL full join+自定义条件列
- Java基础加强总结(4)(类加载器)
- 嵌入式linux UART驱动
- API Demos 2.3 学习笔记 (12)-- Views->Rating Bar
- 互斥锁使用范例
- 用GDB调试程序
- 我的伪ACM之路(省赛三)
- C++对象中数据成员的内存分布
- 程序员面试题精选-设计包含min函数的栈
- 嵌入式Linux之我行——按键驱动在2440上的实例开