类加载器与Class类

发布时间:2019-06-16 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了类加载器与Class类脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

类加载器分类

类加载器负责根据类的全限定名将class文件加载到JVM内存,生成Class类的对象。它分为以下几种类型:

  1. Bootstrap Classloader
    由C++所写,在JVM启动后初始化,负责加载%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类
  2. ExtClassLoader
    是sun.misc.launcher的内部类,继承自java.net.URLClassLoader->java.securITy.SecureClassLoader->java.lang.ClassLoader,在rt.jar中,由Bootstrap Classloader加载,负责加载%JAVA_HOME%/jre/lib/ext和java.ext.dirs系统变量指定路径中的类。parent ClassLoader为null(因为Bootstrap Classloader并不是由java实现的)。
  3. AppClassLoader
    也是sun.misc.Launcher的内部类,继承自java.net.URLClassLoader,负责加载来自在命令java中的-classpath或者java.class.path系统属性或者CLASSPATH系统属性所指定的路径中的类。其parent ClassLoader为ExtClassLoader,且是我们自定义类默认的类加载器。

类加载过程

双亲委派机制:如果一个类未加载,那么必须先由其父加载器(Bootstrap Classloader可以认为是ExtClassLoader父加载器)尝试加载,如果父加载器在其路径内找不到该类才由子加载器加载。可以核心类被外来类覆盖。具体的源码分析可以参见深入理解Java类加载器(ClassLoader)
下面是结合码,画出的利用AppClassLoader查找类的流程图:

类加载器与Class类

Class类

我们通常写的用class(首字母c小写)定义的类,表征了java虚拟机里对象的类型(java是强类型语言),但同时这些类又都是java.lang.Class(首字母C大写)的对象,通过AppClassLoader加载进虚拟机内存方法区。每个类都对应一个独一无二的Class对象,包括Java基本类型、void关键字及数组(所有同一维度和类型的数组拥有同样的Class,数组的长度不做考虑。对应Class的名字表示为维度和类型。比如一个整型数据的Class名为“[I”,字节型三维数组Class名为“[[[B”,两维对象数组Class名为“[[Ljava.lang.Object”)。得到Class对象的方法有三种:

MyObject foo = New MyObject();
@H_512_42@Class c = foo.getClass();

Class c = Class.ForName("MyObject");

Class c = MyObject.class;

脚本宝典总结

以上是脚本宝典为你收集整理的类加载器与Class类全部内容,希望文章能够帮你解决类加载器与Class类所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。