类的初始化和对象实例化
反射机制的目的就是通过类加载获取到字节码文件(运行中的类)的内部数据结构,再对这些获取的信息进行操作,如获取类对象、创建对象实例、获取方法名、调用方法、获取方法参数类型和方法返回类型等。
理解反射前要先了解类的加载及JVM内部的存储机制
类加载时通过 1. 加载
->2.链接 验证(完全性校验)、准备(为静态数据赋予初始值基本数字数据类型为0,boolea型为false,string为null,对象为null)、解析(将符号引用转化为地址引用,为了能够直接在内存中找到数据)
->3.类初始化 执行静态变量、方法并进行赋值
第一个加载过程中:将java文件转换为字节码class文件,在这个转变过程中 将java文件中的信息存到三个区域(堆、栈、方法区)
方法区(特殊的堆): 存放了类结构模板信息 1.代码块 (类的属性、方法、代码) 2.静态变量 3.常量池
堆: 存放了java.lang.class对象,该对象的作用是访问方法区的数据结构从而操作类的信息(反射就是完成这个过程),类的成员变量在对象实例化后通过方法区的数据结构信息存在该区,static成员变量则在类加载初始化后就存在该区了
栈: 存放 方法地址、局部变量等,
程序运行内存分析:
比如存在局部变量A a = new A; 过程中在栈中创建a,通过new创建对象(调用构造器),堆参照方法区中加载类的数据结构创建了A的对象,并且将A对象的地址赋值给了栈中的a(引用),而堆中的这个对象通过引用访问方法区中的数据信息,如给对象赋值某个字符串常量,就是通过A对象中的引用地址访问方法区中的常量池(对象中基本数据类型可直接赋值,无需引用)。如图高琪类加载机制
反射的作用
1).获取字节码文件信息,类名和方法名
2).获取该类名对应的字节码文件对象
3).获取指定的方法对象
4).创建该字节码文件对象
5).调用方法运行
JDK中有多个classLoader,如下:
类加载机制:
类加载器classloader:负责将类文件加载到内存
类主要是通过ClassLoader及其子类完成加载的,类的层次关系加载顺序如下
1.检查(自下而上):该过程中只要检查到某个classloader已经存在则认为该类已经加载了,保证此类所有classloader只加载一次
bootstraploader(启动类加载器): 负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,加载jdk core中的核心类由C++实现
|
extension classloader(标准扩展类加载器): 负责加载java平台中扩展功能的一些jar包,一般在JDK的目录“Java\jre7\lib\ext”目录下
该文件中得了类属于JDK自带引用类,可直接使用,eclipse目录中为JRE Syetem library
|
app classloader(系统类加载器):负责加载classpath中指定的包,一般加载为用户自己定义的class,
|
other classloader:加载其他类型的class SecureClassLoader URLClassLoader等
各个classloader之间是用过getParent()方法在内存拿到引用对象的相互关联(非继承关系)。
在加载一个类时会先通过getParent()引用查找上级加载器是否加载过们,如果加载过则当前加载器不再加载
String str = "T"
Class c = class.forName(str); 获取类名为T的类对象
Object o = c.newInstace(); 为对象创建实例 //该两句实现了关键字new的加载类、生成实例的作用
Method[] methods = c.getMethods(); 获取类的方法成员
for(Method m:methods){
if(m.getName().equals("方法名")) 核对 m对象中的方法是否存在
m.invoke(o); 调用该方法
}
二、细节补充
(1)对比:forName和getClassLoader();http://carl-java.iteye.com/blog/978680
class. forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。而classLoader只干一件事情,就是将.class文件加载到jvm中(即只链接,不做初始化),不会执行static中的内容,只有在newInstance才会去执行static块。
(2)对比:new 和 newInstance
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。
newInstance()是实现IOC、反射、面对接口编程 和 依赖倒置 等技术方法的必然选择,new 只能实现具体类的实例化,不适合于接口
newInstance()是实现IOC、反射、面对接口编程 和 依赖倒置 等技术方法的必然选择,new 只能实现具体类的实例化,不适合于接口
相关推荐
了解和掌握ClassLoader的概念及其应用,对于理解和调试复杂的Java应用程序,尤其是涉及到动态加载和插件化开发的场景,是非常有帮助的。通过深入研究"ClassLoader小例子",你可以更好地理解Java的类加载机制,并为...
### 完整实例分析 在这个实例中,作者通过实现一个自定义的类加载器`myLoader`,并通过类的全名来加载并实例化对象,这与反射机制类似但又有所不同。 #### 自定义类加载器代码解析 ```java public class ...
在Java编程语言中,`Classloader`(类加载器)是一个至关重要的组件,它负责将类的`.class`文件从磁盘加载到JVM(Java虚拟机)内存中,使得程序能够执行。这篇博文主要围绕`Classloader`的`loadClass`方法进行深入...
"Android 内存泄露 Mat工具分析" ...使用 MAT 分析 heap dump 可以快速定位内存泄露的根源,并且可以根据泄漏的根源进行优化和改进。因此,MAT 是一个非常有用的工具,非常适合 Android 应用程序开发者。
博客中提到的源码分析,意味着我们可以深入到Java运行时系统的内部,查看ClassLoader的具体实现,例如`sun.misc.Launcher$AppClassLoader`是Java应用的默认类加载器,而`BootStrapClassLoader`是根加载器,负责加载...
- 分析加载时间和内存消耗,评估性能差异。 - 可能会有异常处理和日志记录,以帮助分析加载过程中的问题。 6. **实际应用** 对于开发者来说,理解这些类加载器的工作原理有助于优化应用的性能和功能。例如,在...
了解内存泄露的原理和分析方法是非常重要的。 在本文中,我们将介绍使用 Memory Analyzer Tool(MAT)来分析内存泄露的方法。MAT 是一个功能强大且易于使用的工具,可以帮助我们快速地找到内存泄露的根源。 首先,...
Android Classloader动态加载分析 Android Classloader动态加载分析是Android应用程序中一个非常重要的知识点。ClassLoader是Java虚拟机(JVM)中的一种机制,负责加载Java类文件到内存中,并将其转换为java.lang....
分析这些文件可以帮助我们更好地理解C++类加载器的具体实现细节,包括它是如何处理类的加载、解析和实例化的。 总之,类加载器是编程语言中实现动态加载和运行代码的关键组成部分。在Java中,类加载器的双亲委派...
### Java ClassLoader与ClassPath详解 #### 一、概述 ...通过以上分析可以看出,Java中的类加载器和类路径机制对于程序的运行至关重要。理解这些概念有助于开发者更好地管理和控制程序中的类和资源的加载过程。
Java内存分析是Java开发者面临的重要任务,因为它直接影响到应用程序的性能和稳定性。JVM(Java Virtual Machine)作为Java程序的运行平台,其内存管理对于理解并优化程序至关重要。 1. JVM简介 JVM是Java虚拟机,...
如IDEA、JProfiler等开发工具提供了分析ClassLoader的功能,帮助开发者调试和优化类加载过程。 10. 框架中的ClassLoader: 在Spring、OSGi等框架中,ClassLoader扮演着关键角色,如Spring的CGLIB代理机制就涉及到...
在Java Web应用中,类加载...通过分析`web_classloader_test`,我们可以学习到如何理解和调试Web应用的类加载问题,以及如何利用类加载器的特性来实现特定的功能。这个示例对于理解Java Web应用的运行机制非常有价值。
总结起来,通过对Tomcat 5.0.18 ClassLoader源码的分析,我们可以更深刻地理解Tomcat如何管理Web应用的类加载,以及如何在多应用环境中保持良好的隔离性和可扩展性。这不仅对解决实际开发中的问题有帮助,也有助于...
在实际应用中,这可以显著减少程序启动时间和内存占用,特别是在处理大型数据集或依赖外部资源时。压缩包内的文件名称列表"LazyWorker-master"表明这是LaZyWorker项目的源代码主分支,开发者可以研究其源码,学习...
总的来说,本文提供了一个关于中间件内存马注入的综合教程,涵盖了冰蝎Webshell的使用,Tomcat和Weblogic中间件的特定注入技术,以及源码分析和修改,对于理解Web安全和防御内存马注入具有重要价值。
1. JVisualVM:提供内存分析、线程监控、CPU性能分析等功能。 2. JConsole:监控JVM的性能和内存状态。 3. jinfo、jmap、jhat:命令行工具用于获取JVM配置、堆转储、堆分析等。 五、内存泄漏与检测 1. 内存泄漏...