Java 反射机制(一)
阅读《Core Java Volume I --- Fundamentals》反射部分,总觉得许多概念艰涩难懂、模棱两可。我想造成这个结果的主要原因可能是Cay S. Horstmann和Gary Cornell这两位大牛认为阅读本书的读者可能并不具备深入了解Java虚拟机技术的知识基础或根本没有精力去啃《深入Java虚拟机》这本经典巨著,为了能够介绍反射概念又不至于让读者大量阅读文献资料,因此有些东西(可能这些内容就是一门系统的课程)只能这么轻飘飘地一笔带过。如果是你是一个有心人,对书中的字眼加以琢磨,仍然会得到很大的收获和提升。
本文主要对《Core Java Volume I --- Fundamentals》中以下概念加以解释:
1. 反射、反射库、反射机制
2. 动态加载类、静态加载类
3. Class类
一、Java 反射概念
Java反射概念涉及到反射、反射库、反射机制这几个核心词。
1)反射(Reflective)
《Core Java》中文第9版中这么定义:能够分析类能力的程序称为反射(reflective)。带着对这句定义的反对想法,查阅了《Core Java》英文第9版,情况如下图所示。显然直译结果是没有任何问题的,那么也就是说:反射指对相应类具有检查、访问、修改能力的程序。
2)反射库(Reflection Library)
The reflection library gives you a very rich and elaborate toolset to write programs that manipulate Java code dynamically.
反射库指的是 java.lang.reflect 包中相应的类及接口。
3)反射机制(Reflection Mechanism)
绝大多数文献资料,貌似都对反射与反射机制这两个概念几乎不区别,就像指针和指针变量这般。但是显然这两者在单词上,无论是中文还是英文都是有区别的。个人认为反射机制强调的是反射实现过程或者其内容;而反射则强调程序本身,是一个比较整体的概念。
二、JVM 类加载机制
此处不是想详细讲明JVM如何通过各种类装载器(例如ClassLoader)对字节码如何加载以及加载顺序问题。而是想谈谈两个概念:静态加载类、动态加载类。如果读者经常使用IDE工具开发Java程序,对JVM静态加载、动态加载的区别或许会感受不深;而如果使用普通的记事本进行编译、解释则会帮助你对Java体系有更好的理解。
1)静态加载类
指的是在通过javac编译Java程序时需要将可能需要的类都加载一遍,否则编译器将不能通过编译。此种情况是不使用Java反射机制产生的情况。
2)动态加载类
指的是在用javac编译Java程序时不必要将所有类都加载,即不全部加载可能需要类也能通过编译。不过,在运行时环境中,程序会根据实际需要的内容装载相应的字节码文件。因此,Java反射机制使用的动态加载类方式明显比静态加载类要优异,具有交互性优异等特点。
三、Java Class类
Java的Class类内容定义在java.lang.Class中。由于网上资料解释不清以及对Class类的理解具有哲学高度等原因,读者往往会对Class类具有一定的理解困难。
网上资料通常会说,Java语言中,万物皆对象(除static、primitive types外),所有的类都是java.lang.Class类的对象诸如此类等等的概念。那么该如何理解这些概念呢?
本文将从另一个视角带读者认识Class类。根据《Core Java》英文第9版中的一段话来进入这篇文章所要阐述的最重要观点。

在你的程序运行期间,Java运行时系统总会为对象维持一个运行时类型标志。这个运行时类型标志跟踪每一个对象所属相应类的信息。Java虚拟机使用这些运行时类型信息来选择执行合适的方法。
然而,你也能够通过专门的Java类来访问运行时类型信息。持有这些运行时类型标志信息的类就是这个有点令人不知所措的Class。Object类中的getClass()方法返回Class类型的实例。
看完我翻译完的这段话后,不知你是否已经略微了解Class类了呢?其实我个人是很讨厌有人把Class Type翻译成类类型,觉得这就像在扯淡。Class类型(或Class Type)本身能够清楚表明意思,但是类类型其实是一个很令人费解的词。
通过一幅"截肢"过的JVM运行时系统图或许能够比较形象地说明这个问题。当然图画的不太完整,略微用文字描述一下。

如果我们现在有一个类Human,创建其对象Human hm = new Human();那么这句话大致是依次干了如下几件事:
a)JVM通过类装载器,先装入系统预定义的类字节码,然后装入自定义的类Human字节码到方法区。
b)然后开始创建对象,将对象静态成员变量、方法保存在Class类中,将方法做成一张查询的虚表。
c)在非栈(堆)中用一个指针指向方法区的虚表,并将对象其余属性也装入非栈(堆)中。
d)在虚拟机堆中对象生成一个hash值,即对象的句柄。这个句柄值被浅拷贝到虚拟机栈中储存。
当然,必须说明:上述的只是一种帮助理解的简化模型,真实的情况并非如此,而且复杂地多。
回到问题本身,Class类本身就是一种最泛化的概念。看它的名字"Class"就能够体会到,人类已经无法用别的名字来表述所有类的共性了,因而就用Class来表示所有class的共性。Class是所有具体class的抽象,反过来,也就是说具体class类都是Class的具体实例,即有了对象的概念。
不得不提的是,正式因为有了Java反射机制,才有了Java泛型编程的广泛应用。具体的内容将会在后续的文章中细说。
声明:文章系作者原创,转载需通过作者同意。由于作者水平有限,部分内容可能存在错误,还望谅解。
Java 反射机制(一)的更多相关文章
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- Java反射机制专题
·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...
- java反射机制深入详解
java反射机制深入详解 转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...
- Java反射机制DOME
Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...
- 反射——Java反射机制
反射概述 什么是反射? ① 反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ② JAVA反射机制是在运行状态中,对应任意一个类,都能 ...
- Java反射机制可以动态修改实例中final修饰的成员变量吗?
问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...
- Java反射机制学习与研究
Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...
随机推荐
- 如何分析一个QT类
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 我们以QLineEdit这个类为例来看看如何学习分析一个QT类. 1.Public Types: 这是一个在这 ...
- 用Pyinstaller把Python3.7程序打包成可执行文件exe
1.通过pip3 install pyinstaller 安装成功 2.然后执行命令,首先:需要切换到程序所在的目录 执行命令 pyinstaller -F -w <文件名.py>,-F代 ...
- 《SpringBoot揭秘 快速构建微服务体系》读后感(三)
SpringApplication:SpringBoot程序启动的一站式解决方案 深入探索SpringApplication执行流程 因为书上的版本是1.2的,比较老,这里参考http://blog. ...
- ASP.NET Core分布式项目实战
ASP.NET Core开发者成长路线图 asp.net core 官方文档 https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/ ...
- HDU - 5950 Recursive sequence(二项式+矩阵合并+矩阵快速幂)
Recursive sequence Farmer John likes to play mathematics games with his N cows. Recently, they are a ...
- echarts学习的一些笔记
工具栏组件 Show 是否显示 Feature 具体显示的功能 saveAslmage 保存图片 Restore 还原 dataZoom 缩放视图 magicType 动态类型切换 toltip组 ...
- C++11 assert/static_assert
assert assert 是运行期断言,它用来发现运行期间的错误,不能提前到编译期发现错误,也不具有强制性,也谈不上改善编译信息的可读性,既然是运行期检查,对性能当然是有影响的,所以经常在发行版本中 ...
- 如何让div中的span垂直居中 ----height:100%设置div的高度
如果div中只有一个span一个元素,可以使用line-height.如果div中还有其他元素,可以设置span的css如下: .span{ position: absolute; top: 50%; ...
- 这几道Python面试题,稳准狠,Python面试题No15
必须放一个表情包,太魔性了! 第1题: 修改以下Python代码,使得下面的代码调用类A的show方法? 原始代码 class A(object): def run(self): print(&quo ...
- C 语言实例 - 计算自然数的和
C 语言实例 - 计算自然数的和 自然数是指表示物体个数的数,即由0开始,,,,,,……一个接一个,组成一个无穷的集体,即指非负整数. 实例 - 使用 for #include <stdio.h ...