阅读《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 反射机制(一)的更多相关文章

  1. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  2. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  3. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  4. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  5. Java反射机制专题

    ·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...

  6. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

  7. Java反射机制DOME

    Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...

  8. 反射——Java反射机制

    反射概述 什么是反射? ①   反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ②   JAVA反射机制是在运行状态中,对应任意一个类,都能 ...

  9. Java反射机制可以动态修改实例中final修饰的成员变量吗?

    问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...

  10. Java反射机制学习与研究

    Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...

随机推荐

  1. Java高并发(1)

    1.同步和异步的区别和联系: 所谓同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到 返回的值或消息后才往下执行其它的命令. 异步,执行完函数或方法 ...

  2. 【249】◀▶IEW-Unit14

    Unit 14 Money and Finance 线图写作技巧 1.Model1对应图片分析 The graph contains information about the price in US ...

  3. 3. docker容器内信息获取、命令的执行、容器的导入和导出

    一.依附容器 依附操作attach通常用在由docker start或者docker restart启动的交互型容器中.由于docker start启动的交互型容器并没有具体终端可以依附,而容器本身是 ...

  4. Python3 编译中文字串报错解决方案

    问题: Python3.6.5 版本中,程序有中文,运行时出现以下error: SyntaxError: Non-UTF-8 code starting with '\xb2' in file XXX ...

  5. Gym - 100801H Hash Code Hacker (构造)

    题意:求 n 个哈希值相同的串. 析:直接构造,通过取模来查找相同的串. 代码如下: #pragma comment(linker, "/STACK:1024000000,102400000 ...

  6. 蜂窝网络TDOA定位方法的Fang算法研究及仿真纠错

    科学论文为我们提供科学方法,在解决实际问题中,能极大提高生产效率.但论文中一些失误则可能让使用者浪费大量时间.自己全部再推导那真不容易,怀疑的成本特别高,通常不会选择这条路.而如果真是它的问题,其它所 ...

  7. 【异步编程】Part1:await&async语法糖让异步编程如鱼得水

    前导 Asynchronous programming Model(APM)异步编程模型以BeginMethod(...) 和 EndMethod(...)结对出现. IAsyncResult Beg ...

  8. nodebrew的安装与使用

    创建: 2019/05/10  安装 brew install nodebrew 初始化 nodebrew setup ~/.bash_profile 里添加 export PATH=/usr/loc ...

  9. PHP RSA算法 HMAC-SHA1加密算法

    HMAC-SHA1加密算法 function getSignature($str, $key) { $signature = ""; if (function_exists('ha ...

  10. 51nod1412(dp)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 代码: #include <bits/stdc+ ...