美文网首页
Java 中的 ClassLoader 加载机制

Java 中的 ClassLoader 加载机制

作者: 程序媛马小兮 | 来源:发表于2019-11-29 21:20 被阅读0次

ClassLoader 翻译过来就是 类加载器,普通的Java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解 ClassLoader 的加载机制,也有利于我们编写出更高效的代码。ClassLoader 的具体作用就是将 class文件 加载到 jvm虚拟机 中去,程序就可以正确运行了。但是,jvm 启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。

一、ClassLoader的概念

Java程序在运行的时候,JVM通过类加载机制(ClassLoader)把class文件加载到内存中,只有class文件被载入内存,才能被其他class引用,使程序正确运行起来.

二、ClassLoader的分类

Java中的ClassLoader有三种.

1. Bootstrap ClassLoader

由C++写的,由JVM启动.

启动类加载器,负责加载java基础类,对应的文件是%JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等

2.Extension ClassLoader

Java类,继承自URLClassLoader

扩展类加载器,对应的文件是 %JRE_HOME/lib/ext 目录下的jar和class等

3.App ClassLoader

Java类,继承自URLClassLoader

系统类加载器,对应的文件是应用程序classpath目录下的所有jar和class等

三、ClassLoader的过程

1.三者关系

Java的类加载使用双亲委托机制来搜索类.三种ClassLoader存在父子关系,App ClassLoader的父类加载器是Extension ClassLoader,Extension ClassLoader的父类加载器是Bootstrap ClassLoader,要注意的一点是,这里的父子并不是继承关系.

我新建一个类Test来验证三者的关系.

publicclassTest{publicstaticvoidmain(String[] args){ ClassLoader ClassLoader1 = Test.class.getClassLoader(); ClassLoader ClassLoader2 = ClassLoader1.getParent(); ClassLoader ClassLoader3 = ClassLoader2.getParent(); System.out.println(ClassLoader1); System.out.println(ClassLoader2); System.out.println(ClassLoader3); }}

看下输出结果

sun.misc.Launcher$AppClassLoader@1bbf1casun.misc.Launcher$ExtClassLoader@1ff0ddenull

2.加载机制

当这三者中的某个ClassLoader要加载一个类时,会先委托它的父类加载器尝试加载,一直往上,如果最顶级的父类加载器没有找到该类,那么委托者则亲自到特定的地方加载,如果没找到,那么就抛出异常ClassNotFoundException.这里画张图来表示下

这里要注意一点:只有被同一个类加载器实例加载并且文件名相同的class文件才被认为是同一个class.

四、自定义ClassLoader

1.为什么要自定义ClassLoader

因为系统的ClassLoader只会加载指定目录下的class文件,如果你想加载自己的class文件,那么就可以自定义一个ClassLoader.

2.如何自定义ClassLoader

2.1

新建一个类继承自java.lang.ClassLoader,重写它的findClass方法。

2.2

将class字节码数组转换为Class类的实例

2.3

调用loadClass方法即可

3.例子

我先建一个叫Log的类,很简单,只有一句打印

publicclassLog{publicstaticvoidmain(String[] args){ System.out.println("加载成功"); }}

我把这个java文件放到D盘根目录,然后打开cmd,用javac命令把java文件转化为class文件

然后我新建一个MyClassLoader继承自ClassLoader

publicclassMyClassLoaderextendsClassLoader { @OverrideprotectedClassfindClass(String name)throwsClassNotFoundException {Classlog =null;// 获取该class文件字节码数组byte[] classData = getData();if(classData !=null) {// 将class的字节码数组转换成Class类的实例log = defineClass(name, classData,0, classData.length); }returnlog; }privatebyte[] getData() {//指定路径String path ="D:/Log.class";Filefile=newFile(path); FileInputStream in =null; ByteArrayOutputStream out =null;try{ in =newFileInputStream(file); out =newByteArrayOutputStream();byte[] buffer =newbyte[1024];intsize=0;while((size= in.read(buffer)) != -1) { out.write(buffer,0,size); } }catch(IOException e) { e.printStackTrace(); }finally{try{ in.close(); }catch(IOException e) { e.printStackTrace(); } }returnout.toByteArray(); }}

最后测试一下,输出加载这个Log的class文件的加载器,并且利用反射调用它的mian方法.

publicclassTest{publicstatic void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { MyClassLoader myClassLoader =newMyClassLoader(); //查找Log这个class文件myClassLoader.findClass("Log"); //加载Log这个class文件ClassLog=myClassLoader.loadClass("Log");System.out.println("类加载器是:"+Log.getClassLoader());  //利用反射获取main方法Methodmethod=Log.getDeclaredMethod("main", String[].class) ;  Object object=Log.newInstance(); String [] arg={"ad"};method.invoke(object, (Object)arg); }}

             需要以上相关电子学习资料的可以加小编wx:bjmashibing003 获取

相关文章

  • ClassLoader深入学习记录

    ClassLoader是什么 ClassLoader是Java的类加载机制ClassLoader用于动态加载cla...

  • java类加载机制学习笔记

    java类加载机制 类加载器(classloader) ClassLoader 类 Bootstrap Class...

  • 为什么说SPI打破双亲委派机制

    简单介绍ClassLoader的双亲委派机制: java类通过Classloader加载,Classloader之...

  • Android的类加载器

    Android的ClassLoader与java的ClassLoader有些差异, 双亲委托机制某个类加载器在加载...

  • JAVA类加载机制

    jvm之java类加载机制和类加载器(ClassLoader)的详解java类加载机制:全盘负责、双亲委派、缓存机...

  • ClassLoader

    类加载机制[1] Java 默认提供的三个 ClassLoader BootStrap ClassLoader 称...

  • 类加载器的概述

    类加载器是JVM执行类加载机制的前提 ClassLoader的作用: ClassLoader是Java的核心组件,...

  • Android类加载器ClassLoader

    Java类加载器(ClassLoader) Java中的ClassLoader是加载class文件,而Androi...

  • Java自定义类加载器

    一、ClassLoader作用 Java程序在运行的时候,JVM通过类加载机制(ClassLoader)把clas...

  • JVM

    Java 类的加载机制 类加载器 启动类加载器:Bootstrap ClassLoader,负责加载存放在JDK\...

网友评论

      本文标题:Java 中的 ClassLoader 加载机制

      本文链接:https://www.haomeiwen.com/subject/rlcnwctx.html