类装载器ClassLoader
类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件。
类装载器把一个类装入JVM中,要经过三步:
1.装载:查找和导入Class文件;
2.链接:执行校验、准备和解析(解析是可以选择的);
3.初始化:对类的静态变量、静态代码块执行初始化工作;
类装载工作由ClassLoader及其子类负责。JVM在运行时会产生三个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)。
根装载器不是ClassLoader的子类,它使用C++编写,因此,我们在JAVA中看不到它,根装载器负责装载JRE的核心类库,如JRE目标下的rt.jar、charsets.jar等。
ExtClassLoader和AppClassLoader都是ClassLoader的子类。其中,ExtClassLoader负责装载JRE扩展目录ext中的类包,AppClassLoader负责装载Classpath路径下的类包。
这三个类装载器之间存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器。
public class ClassLoaderTest { public staticvoid main(String[] args) { ClassLoader loader = Thread.currentThread().getContextClassLoader(); System.out.println("current loader---"+loader); System.out.println("parent loader---"+loader.getParent()); System.out.println("grandparent loader---"+loader.getParent().getParent()); } } |
上面代码运行结果:
current loader---sun.misc.Launcher$AppClassLoader@20cf2c80 parent loader---sun.misc.Launcher$ExtClassLoader@1729854 grandparent loader---null |
由于根加载器在java中访问不到,所以返回null。
每一个类在JVM中都拥有一个对应的java.lang.Class对象,它提供了类结构信息的描述。Class对象是在装载类时由JVM通过调用类装载器中的defineClass()方法自动构造的。
Java反射机制
Class反射对象描述类语义结构,可以从Class对象中获取构造函数、成员变量、方法等类元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射对象类在java.lang.reflect包中。主要的反射类有Constructor、Method、Field、ClassLoader等。
public class PrivateCar { private String color; protected void drive(){ System.out.println("Drive private car! The color is :"+color); } }
public class PrivateCarReflect { public static void main(String[] args) throws Throwable { //通过类装载器获得PrivateCar类对象 ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class clazz = loader.loadClass("com.quietboy.reflect.PrivateCar"); //得到实例 PrivateCar pcar = (PrivateCar)clazz.newInstance(); //访问属性,并设置属性 Field color = clazz.getDeclaredField("color"); color.setAccessible(true);//取消Java语言访问检查,以访问private变量 color.set(pcar, "红色"); //访问方法,并调用方法 Method drive = clazz.getDeclaredMethod("drive", null); drive.setAccessible(true);//取消Java语言访问检查,以访问protected方法 drive.invoke(pcar, null);
} } |
只要JVM的安全机制允许,反射机制可以绕过限制,访问私有变量、调用私有方法。
相关推荐
《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...
最优装载问题——回溯法 最优装载问题——回溯法 最优装载问题——回溯法
第9~10章介绍了Java虚拟机的核心——Class文件结构,以及Java虚拟机中类的装载系统。第11章介绍了Java虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。, 《实战Java虚拟机——JVM故障诊断与...
类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念
反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。
java类装载介绍,介绍了java装载类的先后顺序
类加载器是 Java 语言的一个创新,也是 ...不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时间去调试 ClassNotFoundException和 NoClassDefFoundError等异常。
简单的介绍和描述Java虚拟机类装载:原理、实现与应用
类装载器是Java 平台上最神秘,也是最 有趣的一个组,通过类装载器,除了可以实现程序的动态性之外,更能够做 到 无 懈 可 击 的 安 全 性
Java中,反射是一种强大的工具。...反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内 部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。
工程课程设计——装载机制动器的设计.pdf
主要讲述Java的类装载器和命名空间,ClassLoader/parent delegation模型
类的动态装载机制是JVM的一...本文介绍了JVM中类装载的原理、实现以及应用,尤其分析了ClassLoader的结构、用途以及如何利用自定义 的ClassLoader装载并执行Java类,希望能使读者对JVM中的类装载有一个比较深入的理解。
Java虚拟机类装载的原理及实现
Java虚拟机类装载111.docJava虚拟机类装载111.docJava虚拟机类装载111.doc
java jvm类装载器原理 介绍较为详细 大家可以参考
详细描述java虚拟机内部加载类机制和原理
反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。
Java卡的可信代码装载机制设计
本例采用java编写的装载问题,采用的是FIFO队列形式,参考:算法设计与分析