java类加载器和类反射使用示例

 更新时间:2014年03月10日 16:20:28   作者:  
这篇文章主要介绍了java类加载器和类反射使用示例,需要的朋友可以参考下

一、一个命令对应一个进程。

当我们启动一个Java程序,即启动一个main方法时,都将启动一个Java虚拟机进程,不管这个进程有多么复杂。而不同的JVM进程之间是不会相互影响的。这也就是为什么说,Java程序只有一个入口——main方法,让虚拟机调用。而两个mian方法,对应的是2个JVM进程,启动的是两个不同的类加载器,操作的实际上是不同的类。故而不会互相影响。

二、类加载。

当我们使用一个类,如果这个类还未加载到内存中,系统会通过加载、连接、初始化对类进行初始化。

1、类加载:指的是将类的class文件读入JVM,并为之创建一个Class对象。

2、类连接:指的是把类的二进制数据合并到JRE中,这又分为3个阶段:

a)、校验:检查载入Class文件数据的正确性。

b)、准备:给类的静态变量分配存储空间,并进行默认初始化。

c)、解析:将类的二进制数据中的符号引用替换成直接引用。

3、初始化:对类的静态变量、静态初始化块进行初始化。

(注意:一个final类型的静态属性,如果在编译时已经得到了属性值,那么调用该属性时,不会导致该类初始化,因为这个相当于使用常量;

使用ClassLoader()方法,只是加载该类,并未初始化。)

三、类加载器。

类加载器就是负责将.class文件加载到内存中,并为之生成对应的java.lang.Class对象,它负责加载所有的类,而一旦一个类被加载入JVM中,就不会被再次载入了。

在Java中,一个类用其全限定类名(即包名+类名)作为标识。

而在JVM中,一个类用其全限定类名和其类加载器作为标识。

JVM运行时会产生3个ClassLoader,分别为:BootstrapClassLoader(根类加载器)、ExtClassLoader(扩展类加载器)和AppClassLoader(系统类加载器)。UML结构如下:

其中,BootstrapClassLoader负责加载JRE的核心类库,它不是ClassLoader的子类,使用C++编写,因此我们在Java中看不到它,通过其子类的getParent()方法获取时,将返回null。BootstrapClassLoader负责装载JRE目标下的rt.jar、charsets.jar等Java核心类库。

如图可知,ExtClassLoader和AppClassLoader为ClassLoader的子类。在API中看不到它们,他们位于rt.jar文件中。全限定类名分别为:

sun.misc.Launcher$ExtClassLoader 和 sun.misc.Launcher$AppClassLoader.

其中,ExtClassLoader负责装载JRE扩展目录ext中JAR包,而AppClassLoader负责装载Classpath路径下的类包。

测试如下:

复制代码 代码如下:

package com.stopTalking.crazy;
public class TestClassLoader {
public static void main(String[] args) {
//获取当前线程的类装载器 
ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
//获取System类的类装载器 
ClassLoader loader1 = System.class.getClassLoader(); 
//获取本类TestClassLoader的类装载器loader2 
ClassLoader loader2 = TestClassLoader.class.getClassLoader(); 
//获取loader2的父类 
ClassLoader loader3 = loader2.getParent(); 
//获取loader2的父类的父类 
ClassLoader loader4 = loader3.getParent(); 
System.out.println(loader); 
System.out.println(loader1); 
System.out.println(loader2); 
System.out.println(loader3); 
System.out.println(loader4); 

}

控制台输出:

复制代码 代码如下:

//当前线程类获取的类加载器是AppClassLoader
sun.misc.Launcher$AppClassLoader@6b97fd
//System类为根装载器加载,java中访问不到,所以为null
null
//本类的类加载器当然也是AppClassLoader
sun.misc.Launcher$AppClassLoader@6b97fd
sun.misc.Launcher$ExtClassLoader@1c78e57
null

相关文章

  • Elasticsearch8.1中的Script使用实例深入解读

    Elasticsearch8.1中的Script使用实例深入解读

    这篇文章主要为大家介绍了Elasticsearch8.1中的Script使用实例深入解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 关于java入门与java开发环境配置详细教程

    关于java入门与java开发环境配置详细教程

    这篇文章主要介绍了关于java入门与java开发环境配置详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • SpringCloud使用Kafka Streams实现实时数据处理

    SpringCloud使用Kafka Streams实现实时数据处理

    使用Kafka Streams在Spring Cloud中实现实时数据处理可以帮助我们构建可扩展、高性能的实时数据处理应用,Kafka Streams是一个基于Kafka的流处理库,本文介绍了如何在SpringCloud中使用Kafka Streams实现实时数据处理,需要的朋友可以参考下
    2024-07-07
  • Java动态填充Excel模板实战教程

    Java动态填充Excel模板实战教程

    在日常开发中,我们经常需要生成格式统一的 Excel 文件,比如报表、发票、订单清单、成绩单等,手动创建 Excel 文件不仅效率低,而且难以保证样式的一致性相比之下,所以本文将介绍如何通过Java实现Excel模板的数据填充与自动化导出,需要的朋友可以参考下
    2025-07-07
  • java7改善后的异常处理

    java7改善后的异常处理

    在本篇文章里小编给大家整理的是关于java7改善后的异常处理知识点总结,有需要的朋友们参考下。
    2019-11-11
  • SpringCloud使用Feign实现动态路由操作

    SpringCloud使用Feign实现动态路由操作

    这篇文章主要介绍了SpringCloud使用Feign实现动态路由操作,文章围绕主题展开详细的内容介绍具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • Java利用DelayQueue实现延迟任务代码实例

    Java利用DelayQueue实现延迟任务代码实例

    这篇文章主要介绍了Java利用DelayQueue实现延迟任务代码实例,DelayQueue 是一个支持延时获取元素的阻塞队列, 内部采用优先队列 PriorityQueue 存储元素,同时元素必须实现 Delayed 接口,需要的朋友可以参考下
    2023-12-12
  • 深入分析Comparable与Comparator及Clonable三个Java接口

    深入分析Comparable与Comparator及Clonable三个Java接口

    接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义,这篇文章主要为大家详细介绍了Java的Comparable,Comparator和Cloneable的接口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-05-05
  • Log4j2 重大漏洞编译好的log4j-2.15.0.jar包下载(替换过程)

    Log4j2 重大漏洞编译好的log4j-2.15.0.jar包下载(替换过程)

    Apache 开源项目 Log4j 的远程代码执行漏洞细节被公开,由于 Log4j 的广泛使用,该漏洞一旦被攻击者利用会造成严重危害,下面小编给大家带来了Log4j2 重大漏洞编译好的log4j-2.15.0.jar包下载,感兴趣的朋友一起看看吧
    2021-12-12
  • JavaGUI界面实现页面跳转方法

    JavaGUI界面实现页面跳转方法

    这篇文章主要给大家介绍了关于JavaGUI界面实现页面跳转的相关资料, GUI是指图形用户界面,指采用图形方式显示的计算机操作用户界面,需要的朋友可以参考下
    2023-07-07

最新评论