Java中的类加载器(ClassLoader)及类的加载机制
来源:互联网 发布:搜衣服的软件 编辑:程序博客网 时间:2024/05/15 12:10
类加载器就是用来将class文件加载到内存中的一个java类!
系统默认有三个类加载器!
①BootStrap:这不是java类,是java虚拟机在启动的时候加载的第一个类,这个加载器用来加载核心类,jdk安装目录\jre\lib\rt.jar下的类由这个类加载器加载!
②ExtClassLoader:是java类,加载jdk安装目录\jre\lib\ext目录下的jar文件;
③AppClassLoader: 加载CLASSPATH目录下的jar文件;
===================
set path:查看path环境变量的值;set path=d:\;%path%,给环境变量新增一个路径,并且保留原来的路径;path值是windows搜索可执行文件路径;
set classpath:查看classpath的值,在dos窗口设置的值是临时的;set classpath=d:\ ;路径有分号结尾时,虚拟机先去classpath路径下搜索需要的class文件,如果找不到,则在当前目录下找;当classpath路径没有分号结尾时,表示虚拟机只去指定的目录下找,找不到就报异常!如果需要在当前目录下诏,则可以这样设置 set classpath=.;d:\ (没有分号结尾!)
=========================
下面演示各个类加载器:
public class ClassLoaderTest { public static void main(String[] args) { ClassLoader loader = ClassLoaderTest.class .getClassLoader(); while(loader!=null ){ System. out.println(loader); loader=loader.getParent(); //得到父加载器; } /*输出结果 sun.misc.Launcher$AppClassLoader@61e63e3d sun.misc.Launcher$ExtClassLoader@53004901*/ /** * 当把该类export ->java-> jar files->选择路径:D:\Develop\Java\jdk1.8.0_05\ jre\lib \ext\oterman.jar * 即将该类放于ExtClassLoader加载的目录时,此时的输出为: * sun.misc.Launcher$ExtClassLoader@15db9742 * 注意需要选择run configurations 的JRE为上述导出的 jre,否则不会达到我们指定的效果;不能选择 myeclipse自带的jre! * 类加载器的机制是先找父类去帮忙加载,父类在自己的目录加载失败后才交给子类! */ }}
类加载器的委托机制:
当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
首先当前线程的类加载器去加载线程中的第一个类。
如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
每个类加载器加载类时,又先委托给其上级类加载器。
当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,那有多个儿子,找哪一个呢?
对着类加载器的层次结构图和委托加载原理,解释先前将ClassLoaderTest输出成jre/lib/ext目录下的itcast.jar包中后,运行结果为ExtClassLoader的原因。
首先当前线程的类加载器去加载线程中的第一个类。
如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
每个类加载器加载类时,又先委托给其上级类加载器。
当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,那有多个儿子,找哪一个呢?
对着类加载器的层次结构图和委托加载原理,解释先前将ClassLoaderTest输出成jre/lib/ext目录下的itcast.jar包中后,运行结果为ExtClassLoader的原因。
========================
ClassLoader:
抽象类有
loadClass():该方法实现了委托父类加载类的机制,如果如果找不到,会调用findClass();
findClass():自己实现该方法返回class,可以调用defineClass()按照自己的需求去返回一个类的字节码!
defineClass(String name, byte[] b, int off, int len):将一个 byte 数组转换为 Class 类的实例。
调用时则:
MyClassLoader.loadClass()返回class对象
自定义ClassLoader:需要将这个classloader挂载搞加载树上去,即需要指定父加载器!重载有参数的构造方法即可!
例:下面这个例子将byte[]加载为class文件!
========================
ClassLoader:
抽象类有
loadClass():该方法实现了委托父类加载类的机制,如果如果找不到,会调用findClass();
findClass():自己实现该方法返回class,可以调用defineClass()按照自己的需求去返回一个类的字节码!
defineClass(String name, byte[] b, int off, int len):将一个 byte 数组转换为 Class 类的实例。
调用时则:
MyClassLoader.loadClass()返回class对象
自定义ClassLoader:需要将这个classloader挂载搞加载树上去,即需要指定父加载器!重载有参数的构造方法即可!
例:下面这个例子将byte[]加载为class文件!
/**
* 自定义类加载器,将byte[]加载为class对象
* @author oterman
*
*/
class MyClassLoader extends ClassLoader{
//自定父加载器,按照加载机制进行加载!加载一个类时,都先交给父类加载,父类加载不了,才一级一级往下传!
public MyClassLoader(ClassLoader parent) {
super(parent);
}
public Class getClass(byte[] bytes){
System. out.println("myclassloader2...." );
return defineClass(null, bytes, 0, bytes.length);
}
}
=================
使用自定义的classloader:
//将硬盘上的class文件读取为byte[];
FileInputStream fis = new FileInputStream(dir);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte [1024];
int len = 0;
while ((len = fis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
byte[] bytes = bos.toByteArray(); //class文件的字节码
//自定义classloader,将byte[]翻译成class对象
MyClassLoader classloader = new MyClassLoader(this.getClass().getClassLoader());
Class clazz =classloader.getClass(bytes);
//判断该类上是否有注解,如果有,则放入map中去;
Control annotation = ( Control) clazz.getAnnotation(Control.class) ;
if (annotation != null) {
String uri = annotation.value();
actionMap.put(uri, clazz.newInstance());
}
0 0
- Java中的类加载器(ClassLoader)及类的加载机制
- java 的类加载机制(classloader)
- java 类的加载(ClassLoader)机制
- Java类的加载机制 ClassLoader
- java 的 ClassLoader 类加载机制详解
- Java 类加载器Classloader机制解析
- Java类加载器classLoader的工作机制
- Java类加载器classLoader的工作机制
- 类加载器CLASSLOADER的工作机制
- java中的ClassLoader类加载器
- classLoader类加载机制
- ClassLoader类加载机制
- classLoader类加载机制
- 类加载机制ClassLoader
- 类加载机制ClassLoader
- ClassLoader类加载机制
- Java的ClassLoader加载机制
- Java的ClassLoader加载机制
- Android studio导入第三方类库的方法
- HDU 4267 A Simple Problem with Integers(树状数组)
- Android Handler 异步消息处理机制的妙用 创建强大的图片加载类
- 未能加载文件或程序集“OSCommunicationLib”或它的某一个依赖项。试图加载格式不正确的程序。
- java JVM设置
- Java中的类加载器(ClassLoader)及类的加载机制
- 五分钟理解一致性哈希算法(consistent hashing)
- SPOJ QTREE4 lct
- xunsearch使用namespace后bug修复
- 2
- Outlook 2007 发送邮件的发件人中文为问号的解决方法
- bzoj3932: [CQOI2015]任务查询系统 主席树
- FreeMarker 自定义指令,并增加参数(四)
- apache MINA之心跳协议运行机制