深入解析反射机制 (一)

在谈论到反射这个问题时,你是否有如下疑问?

无论是在.NET还是Java中反射的原理和机制是一样的,理解了一种另一种就可以迎刃而解,想要理解反射首先需要了解底层的一些概念和运行,理解了反射有助于你理解程序的运行原理,目前很多框架(java、.NET)中都引入了反射这一个技术,反射其实也不是什么新的技术只是几个不同的操作过程集成到一起关联起来了。

从表面上我们看到的效果是这样的:通过传入一个字符串可以得到某个类的对象,在这一个过程中做了很多事情。你是否有下面的一些疑问存在?

      JDK、JRE是一回事吗?

      JRE和JVM有联系吗?

      JVM和类加载器什么关系?

      类加载器加载类的过程?

      反射和类加载之间有什么神秘关系?

看完这篇文章,也许你会对反射有一个清晰的认识。

JDK是为我们开发提供的一个开发类库,里面存在着大量的开发类,而JRE是开发好的程序运行的环境,也就是说你的电脑上如果想运行java程序可以没有JDK,但要有JRE这个运行环境,往往下载了JDK开发包已经包含了JRE这个环境,安装时是可以选择不安装JRE的,你开发好的程序都需要测试、运行等,因此有必要安装JRE。

而JVM是存在JRE这个环境里的,只是在JRE这个环境里面不止仅有JVM,JVM是必须的,如果没有其它的类辅助JVM运行,JVM是没有办法运行的,举个简单的例子来看看好想红花也许绿叶来衬托、如果没有绿叶的衬托怎么会显示出红花的价值呢。

类加载器这些类是JVM提供的,负责把类(.class文件)读入到内存中,并且为每个加载到内存中的类创建一个Class对象,你可以理解为一般我们看到的类都有一个超类Class,当一个类加载时就会为这个类实例化一个Class对象,这个对象负责唯一标示该类,事实表明这个Class对象非常有用,如论是反射还是注解等的实现都依赖于这一对象,我们通过这个Class对象里面的方法可以获取到任何一个类的所有方法(包括父类集成来的)、所有字段(包括私有属性)、构造器等等,在上一篇注解博客中核心就是利用了Class对象的getMethods()方法,得到一个类的所有方法,然后循环判断注解才实现对注解方法起作用。

获得Class对象的三种方式

1.Class类的forName(String clazzName)

2.调用某个类的class属性,如Person.class

3.某个对象的getClass()方法

类加载的步骤(想了解的更细节可以看一下JVM规范)

1.加载

指的是将.class文件读入内容,并为之创建一个Class对象;可以理解为所有的类也是实例,它们都是java.lang.Class这个类的实例。

加载类的途径

A:从本地文件系统中加载.class文件

B:从JAR包中加载.class文件,例如你连接mysql或oracle数据库时,是不是有一个驱动jar包,驱动类都放在这个jar中,再多说一点:关于驱动jar文件,一个驱动可以连接哪个数据库或者支持啥功能,本地事务还是全局事务,主要看驱动里面支持不支持。

C:网络加载

D;java文件先编译,再加载

2.连接

将内容中的.class二进制文件读入到JRE代表的进程内容中,又分为验证、准备、解析三个过程。

3.初始化

主要是对一些静态字段赋值操作,初始化时可能并没有类的实例呢,所以是只初始化类范围的变量,如static修饰的变量。

初始化不仅仅是对目标类初始化,如果它有继承的父类,它的父类会都初始化,我们知道所有类都是object的子类,object每次都会被初始化,这也解析了为什么你可以调用Object这个类的方法,因此它也初始化了。

类加载器

从上图中我们可以得知哪些类加载器以及它们主要负责加载哪些类,其中MyClassLoader1/2是自定义类加载器,可以从指定目录加载类,即.java文件不再classpath路径下也可以加载,有时我们会遇到找不到类的问题,其实就是类路径写的不错。

类加载器加载类算法?

内存管理、CUP调度等都有自己的算法,比如先进先出、最早使用原则,写算法的目的是实现资源合理调配,从各种方案中找到一种可以解决实际问题的思路,类再加载类时也存在这样的问题,如遇到一个.class类后,让哪一个加载器加载?去哪里找加载的类?等等,电脑是很傻的,不要把电脑想的很聪明,不要让电脑去做选择,它的选择是我们给它指定的。

算法

依赖原则:当一个类加载时,它所依赖的类同时被加载。

尊老爱幼::针对加载器,每次加载类都让着长辈,父加载器优先。

缓存:所有加载好的类放入一个缓存中,加载某个类时先去缓存中查找,不存在的话才去加载(如果你修改了一个加载好的类,也是存在的不去重新加载),这也是为什么每次我们修改了一个类后,需要重新启动tomcat即重启JVM。

上面这些是实现反射的基础,总结就两点一是Class对象;而是类加载器;反射主要是依赖于java的这两个特性实现的反射过程,下篇中将用一个实例来实现反射,通过从属性文件或者配置文件中读取类的字符串信息来实例化类,Spring框架也是利用的这一个过程实现依赖注入的。

对于底层的一些东西觉的还是有必要理解、并可以使用,各种框架都依赖于底层,这对学习框架也是很有帮助的。

时间: 2024-10-13 17:21:07

深入解析反射机制 (一)的相关文章

深入解析反射机制 (二)

上一篇中已经介绍了一些关于反射的基本概念,这篇主要通过一个实例说一说反射的过程,以及实际中应用的例子. 这个例子是这样的设计思路:从一个属性文件中读取一段字符串,然后,根据该字符串生成对应的类实例对象:这之后还有一个增强版的例子,可以根据类里面的setter()方法将类的成员变量(引用类型)也进行初始化,Spring框架是这么实现的. 项目结构如下: 本例子包括三个类 1.reflect.properties属性文件,里面为key-value键值对,如下 name=javax.swing.JFr

XStream解析XML文本并用反射机制转换为对象

xml文本格式是网络通信中最常用的格式,最近特别研究了一下如何解析xml文本并转换为对象,现在分享一下我最近的学习成果~ 先列一下本例中需要解析的xml文本: Xml代码   <results name="list"> <row pubtime="2016-04-13 16:40:13" author="APP"  id="140" title="什么是公告" content="

ReflectUitls类的编写和对反射机制的解析

ReflectUitls类的编写和对反射机制的解析 反射相关的类 反射相关的类,最基本的当然是Class类. 获取了Class对象之后,就可以接着生成对象实例.调用方法.查看字段等等. 字段(Field).方法(Method)和构造方法(Constructor<T>)各有相应的类来表示,它们共同继承于java.lang.reflect.AccessibleObject类: 这三个类共同实现的还有Member接口: 获取字段.方法和构造方法时,需要调用Class类的getXXX()和getDec

Java反射机制实现微信公众平台XML数据解析

在做微信公众平台开发时,接收消息中有很多种类型的xml消息,比如"文本消息""图片消息""语音消息""视频消息""链接消息""地理位置消息"等等,最初在开发时针对每一种数据格式写了一个实体类,单独做解析,当然这样写的好处是层次分明.但经过尝试之后,用一个统一的实体类消息做处理,更加高效,当然,里面最核心的就是在遍历xml数据时,通过反射的机制动态调用set方法: 1.ReceiveXml

利用Java反射机制完成XML到对象的解析

对于一些小批量的数据,如果采用数据库来存取的话,未免有点大题小作,使用XML文件是个不错的方法,尤其是在一些Web应用中,经常需要缓存一部分数据,如果将这些数据形成XML文件,解析后放入一个Hashtable,那就能大大加快访问的速度. 由于工作的需要,写了一个解析工具,将XML解析成相应的对象列表.以下是源代码,希望对大家有所帮助,更希望大家帮我来改进这个工具. package com.sp.util; /* * author:hingwu * email:[email protected]

利用Java反射机制和泛型,全自动解析json

有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量  Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去执行这个方法 m1 = cls.getDeclaredMethod(getMothodName(fields[j].getName()), String.class); m1.invoke(result,json.getString(fields[j].getName()) ); 利用泛型 去获取这

Android反射机制实现与原理

本文介绍Android反射机制实现与原理,在介绍之前,要和Java进行比较,所以先看下Java中的反射相关知识: 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 在Java中的反射机制,被称为Reflection(大家看到这个单词,第一个想法应该就是去开发文档中

Java反射机制及IoC原理

一. 反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 类中有什么信息,利用反射机制就能可以获得什么信息,不过前提是得知道类的名字. 二. 反射机制的作用 在运行时判断任意

工厂模式(Factory Pattern)和java反射机制优化思考

GOF的工厂模式是最基础的一种创建型设计模式,其适用于创建同一接口的不同实现子类, 其优点是:将使使用者更加方便使用,而不关心具体的创建逻辑 缺点是:每增加一个接口的子类,必须修改工程类的相关逻辑(后面我们用java的反射机制进行优化) 从上面UML图看到,我们设置了一个Shape接口,并且实现了三个子类,我们通过ShapeFactory来根据不同的名称返回不同的子类实例,通过FactoryPatternDemo进行的测试.逻辑很简单,不再详述. public class ShapeFactor