类装载器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虚拟机中的...
所有JVM都内置了一个特殊的类装载器——根装载器(Bootstrap ClassLoader),它负责装载Java核心类库。当需要装载非设计时已知的类时,则需要使用用户自定义的类装载器。 #### 实例演示 以下是一个简单的示例,...
- **启动类装载器**:由JVM自身实现,主要负责加载JDK的核心类库,如rt.jar中的java.lang.*等基础类。 - **用户自定义装载器**:继承自`java.lang.ClassLoader`抽象类,可以由开发者创建以加载特定位置或方式获取...
第9~10章介绍了Java虚拟机的核心——Class文件结构,以及Java虚拟机中类的装载系统。第11章介绍了Java虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。, 《实战Java虚拟机——JVM故障诊断与...
### Java深度历险(2)--深入类装载器 #### 前言 在现代软件开发领域,特别是使用Java这样的高级编程语言时,“动态性”是一个非常重要的概念。它指的是程序能够在运行时根据需要加载、卸载或替换部分代码的能力。这...
Java虚拟机类装载机制是Java运行环境中的核心组成部分,它负责将类的字节码从磁盘、网络等不同来源加载到JVM中,并进行一系列处理以使类能够被正确地使用。类装载机制的目的是为了实现代码的动态加载和运行时的灵活...
最优装载问题——回溯法 最优装载问题——回溯法 最优装载问题——回溯法
类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念 类装载器学习一、类加载器的基本概念
Java虚拟机(JVM)是Java程序运行的核心,它的类装载机制是理解Java应用程序如何启动、运行和管理的关键。本文将深入探讨Java虚拟机的类装载机制,包括其原理、工作流程以及在实际开发中的应用。 类装载机制是Java...
另一个例子是Java的反射API,它利用类装载机制在运行时动态访问和操作类的属性和方法。 总的来说,理解Java虚拟机的类装载机制对于深入掌握Java应用程序的运行机制至关重要。通过自定义ClassLoader,开发者可以实现...
通过实践编写自己的类装载器,不仅可以加深对JVM内部工作原理的理解,还能锻炼对Java反射、字节码操作、类加载机制的掌握。这是一个提升Java技术水平的重要步骤,也是成为一名资深Java开发者必备的技能之一。
本文将详细介绍Java基础中的反射机制,包括Class类、ClassLoader类、Constructor、Method、Field类的用法,以及动态代理机制。 Class类 Class类是Java中一个特殊的类,用于描述类本身的信息。每个类在JVM中都有一...
- 字节码文件被加载到Java虚拟机中,由**类装载器(ClassLoader)**加载,经过**字节码校验器(Bytecode Verifier)**验证后,由**解释器(Interpreter)**执行。 - 这个过程确保了Java程序的安全性和跨平台性。 ...
Java类装载器机制是Java语言灵活性的关键组成部分,尤其在J2EE应用服务器中扮演着重要角色。理解这一机制有助于开发者更好地部署和管理应用程序,解决可能出现的部署问题。 Java类装载器是Java虚拟机(JVM)的一...
《JVM类装载器原理详解》 Java的JVM(Java Virtual Machine)类装载器是...总之,深入理解JVM的类装载器原理,不仅有助于我们更好地理解和调试Java程序,也有助于我们在实际开发中实现更加高效和灵活的类管理机制。
java类装载介绍,介绍了java装载类的先后顺序
### 2021年Java大厂面试题详解——大厂真题之携程-Java高级 ...通过对以上知识点的深入理解,可以帮助Java开发者更好地掌握JVM的类加载机制,从而在实际开发中避免一些常见的问题,并提高系统的稳定性和安全性。
【JVM】类的奇幻漂流——类加载机制探秘 Java虚拟机(JVM)是运行Java程序的核心组件,它负责将我们编写的类加载到内存中并执行。类加载机制是JVM的一个重要组成部分,它确保了程序的正常运行。本文将带你深入理解...
通过采用Java反射机制,可以获得类的信息,构建类的Class对象和生成类的实例,并访问装载到JVM中的类的内部信息。 在本文中,我们使用了POI组件来实现Excel文件的操作,并采用Java反射机制来实现数据库与Excel文件...