首页 > 其他分享 >一,类加载器和反射

一,类加载器和反射

时间:2024-10-21 20:58:49浏览次数:1  
标签:初始化 Java 反射 ClassLoader 使用 加载

Java 类加载器和反射机制详解

在Java中,类加载器和反射是两个非常重要的概念,它们允许程序在运行时动态加载类和操作对象。本文将详细介绍Java的类加载器机制和反射机制,包括它们的工作原理和实际应用。

类的加载

类加载过程

类的加载是Java程序运行的基础。当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过以下三步来实现对这个类进行初始化:

  1. 加载:将.class文件读入内存,并为之创建一个Class对象。
  2. 连接
    • 验证:检查类是否有正确的内部结构,并与其他类协调一致。
    • 准备:为类的静态成员分配内存,并设置默认初始化值。
    • 解析:将类的二进制数据中的符号引用替换为直接引用。
  3. 初始化:执行类的静态初始化块和静态变量的初始化。

类初始化时机

类初始化发生在以下情况:

  • 创建类的实例。
  • 访问类的静态变量或为静态变量赋值。
  • 调用类的静态方法。
  • 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。
  • 初始化某个类的子类。
  • 直接使用java命令来运行某个主类。

类加载器

类加载器组成

Java类加载器负责将.class文件加载到内存中,并为之生成对应的Class对象。类加载器的组成包括:

  • Bootstrap ClassLoader(根类加载器):负责Java核心类的加载,如System, String等。它通常不可见,由C++实现。
  • Extension ClassLoader(扩展类加载器):负责JRE的扩展目录中jar包的加载。
  • System ClassLoader(系统类加载器):负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径。

类加载器的作用

  • Bootstrap ClassLoader:加载Java核心库,通常位于JDK的jre/lib目录下的rt.jar文件中。
  • Extension ClassLoader:加载JRE的扩展目录中的jar包,通常位于JDK的jre/lib/ext目录。
  • System ClassLoader:加载用户类路径上的类和jar包。

反射

反射机制

Java反射机制允许程序在运行时获取类的完整信息,并动态地创建对象、调用方法和访问字段。反射的核心是Class类。

通过反射获取构造方法并使用

  • 获取构造方法:使用getConstructors()getDeclaredConstructors()
  • 创建对象:使用newInstance()Constructor对象的newInstance()方法。

通过反射获取成员变量并使用

  • 获取所有成员:使用getFields()getDeclaredFields()
  • 获取单个成员:使用getField()getDeclaredField()
  • 修改成员的值:使用Field对象的set(Object obj, Object value)方法。

通过反射获取成员方法并使用

  • 获取所有方法:使用getMethods()getDeclaredMethods()
  • 获取单个方法:使用getMethod()getDeclaredMethod()
  • 暴力访问:使用Method对象的setAccessible(true)方法,可以忽略访问控制,访问私有方法和字段。

总结

类加载器和反射是Java语言的核心特性,它们为Java程序提供了极高的灵活性和动态性。通过类加载器,Java程序能够在运行时动态加载类;而反射机制则允许程序在运行时分析和操作类和对象。理解这些机制对于深入掌握Java语言和开发复杂的Java应用程序至关重要。

标签:初始化,Java,反射,ClassLoader,使用,加载
From: https://www.cnblogs.com/bjynjj/p/18490407

相关文章

  • 类加载过程详解
    类的生命周期类从被加载到虚拟机内存中开始到卸载出内存为止,它的整个生命周期可以简单概括为7个阶段:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)。其中,验证、准备和解析这三个阶段可以统称为连接(Link......
  • Java反射
    Java反射引言在已知全类名的情况下,如果不通过new方法,如何创建一个对象并调用其方法?答:通过Java反射下面是实现的代码,仅展示一下反射用法,后面会讲如何使用配置参数class.path=com.shen.inspection.modules.reflection.DemoEntitymethod.name=hello需要创建实例的类......
  • 反射-Class类详解
    概述        在Java中,除了int等基本类型外,Java的其他类型全部都是class(包括interface)。例如:StringObjectRunnableException...        Java反射机制是Java语言的一个重要特性。在学习Java反射机制前,大家应该先了解两个概念:编译期和运行期。     ......
  • 百度地图引入个性化样式,加载时出现大片白块的解决办法
    百度地图引入个性化样式,加载时出现大片白块的解决办法问题描述大屏使用某个地区的详细地图,设置了百度地图自定义样式为深蓝色地图,但是加载的时候,瓦片会出现大片白色的情况,之后才会加载出来深蓝色地图,本文介绍一个方法,来解决加载的时候出现大片白色的问题直奔主题前端......
  • PbootCMS登录页面无法正常加载,显示为空白页或错误信息怎么办
    问题描述:登录页面无法正常加载,显示为空白页或错误信息。解决方案:检查Web服务器配置:确保Web服务器(如Apache、Nginx)配置正确,特别是虚拟主机配置。检查PHP配置:确保PHP配置正确,特别是php.ini文件中的设置。检查文件权限:确保PBootCMS相关目录和文件的权限设置正确。检查PHP错误......
  • d1-h u-boot 加载系统
    原文:https://blog.csdn.net/weixin_43094346/article/details/123083518前言我属于提前批拿到哪吒开发板的,兴奋之余开始研究如何去运行自己的裸机程序,美其名曰:操作系统.和mcu不一样,sbc级别的cpu跑起来要复杂的多,不过好在系统级别的领域,不同的软件分工明确,我们......
  • 懒加载
    懒加载当调用某个属性或方法时,相关的资源(如对象实例等)不会立即加载,而是在需要的时候才进行加载,这种策略可以显著减少内存消耗。拿django-admin来举例urls.pyurlpatterns=[path('admin/',admin.site.urls),]相关知识点classPerson(object):def__init__(s......
  • Java之反射机制详解
    一、基本概念Java反射(Reflection)是一种允许程序在运行时动态地检查和操作类、接口、字段、方法等内部信息的机制。通过反射,程序可以在不知道对象类型的情况下创建对象、调用方法和访问字段,甚至访问私有成员。反射机制为Java程序提供了极大的灵活性和扩展性,是Java语言中一个......
  • so加载流程分析
    源码我的安卓版本:Pie9.0.0_r查看android源码的网站AndroidXRefAOSPXRefso的加载有两种方式,一种是在Java层加载,另一种是在Native层加载。Java层在Java层加载so的方式,这里有两种方式在源码的System.java类里System.load(“/data/data/app包名/lib/libnative-lib.so......
  • java反射机制
    什么是java反射呢,先来看Oracle官方的解释:“ReflectionenablesJavacodetodiscoverinformationaboutthefields,methodsandconstructorsofloadedclasses,andtousereflectedfields,methods,andconstructorstooperateontheirunderlyingcounterparts,......