没有合适的资源?快使用搜索试试~ 我知道了~
Java reflect 机制详解

温馨提示
免费共享,很详细的介绍了反射机制的原理,适合追根究底的java学习者
资源推荐
资源详情
资源评论





















摘要
Reflection 是 Java 被视为动态(或准动态)语言的一个关键性质。这个机制允许
程序在运行时透过 Reflection APIs 取得任何一个已知名称的 class 的内部信息,
包括其 modifiers(诸如 public, static 等等)、superclass(例如
Object)、实现之 interfaces(例如 Cloneable),也包括 fields 和
methods 的所有信息,并可于运行时改变 fields 内容或唤起 methods。本文借由
实例,大面积示范 Reflection APIs。
关于本文:
读者基础:具备 Java 语言基础。
本文适用工具:JDK1.5
关键词:
Introspection(内省、内观)
Reflection(反射)
有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术
与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic
linking)、动态加载(dynamic loading)等。然而“动态”一词其实没有绝对而
普遍适用的严格定义,有时候甚至像对象导向当初被导入编程领域一样,一人一把号,
各吹各的调。
%
一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改
变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,
Perl,Python,Ruby 是动态语言,C++,Java,C#不是动态语言。
%
尽管在这样的定义与分类下 Java 不是动态语言,它却有着一个非常突出的动态相关
机制:Reflection。这个字的意思是“反射、映象、倒影”,用在 Java 身上指的是我
们可以于运行时加载、探知、使用编译期间完全未知的 classes。换句话说,Java
程序可以加载一个运行时才得知名称的 class,获悉其完整构造(但不包括
methods 定义),并生成其对象实体、或对其 fields 设值、或唤起其 methods
1
。
这种“看透 class”的能力(the ability of the program to examine
itself)被称为 introspection(内省、内观、反省)。Reflection 和
introspection 是常被并提的两个术语。
%
Java 如何能够做出上述的动态特性呢?这是一个深远话题,本文对此只简单介绍一
些概念。整个篇幅最主要还是介绍 Reflection APIs,也就是让读者知道如何探索
class 的结构、如何对某个“运行时才获知名称的 class”生成一份实体、为其
fields 设值、调用其 methods。本文将谈到 java.lang.Class,以及
java.lang.reflect 中的 Method、Field、Constructor 等等 classes。
%
“Class”class
1

众所周知 Java 有个 Object class,是所有 Java classes 的继承根源,其内声
明了数个应该在所有 Java class 中被改写的 methods:
hashCode()、equals()、clone()、toString()、getClass()等。其中
getClass()返回一个 Class object。
%
Class class 十分特殊。它和一般 classes 一样继承自 Object,其实体用以表达
Java 程序运行时的 classes 和 interfaces,也用来表达
enum、array、primitive Java types(boolean, byte, char, short,
int, long, float, double)以及关键词 void。当一个 class 被加载,或当加
载器(class loader)的 defineClass()被 JVM 调用,JVM 便自动产生一个
Class object。如果您想借由“修改 Java 标准库源码”来观察 Class object 的实
际生成时机(例如在 Class 的 constructor 内添加一个 println()),不能够!
因为 Class 并没有 public constructor(见图 1)。本文最后我会拨一小块篇幅
顺带谈谈 Java 标准库源码的改动办法。
%
Class 是 Reflection 故事起源。针对任何您想探勘的 class,唯有先为它产生一
个 Class object,接下来才能经由后者唤起为数十多个的 Reflection APIs。
这些 APIs 将在稍后的探险活动中一一亮相。
#001 public final
#002 class Class<T> implements java.io.Serializable,
#003 java.lang.reflect.GenericDeclaration,
#004 java.lang.reflect.Type,
#005 java.lang.reflect.AnnotatedElement {
#006 %% private Class() {}
#007 %% public String toString() {
#008 %%%%%% return ( isInterface() ? "interface " :
#009 %%%%%% (isPrimitive() ? "" : "class "))
#010 %% + getName();
#011 }
...
图 1:Class class 片段。注意它的 private empty ctor,意指不允许任何人经由编程方
式产生 Class object。是的,其 object 只能由 JVM 产生。
“Class” object 的取得途径
Java 允许我们从多种管道为一个 class 生成对应的 Class object。图 2 是一份整
理。
Class object 诞生管道 示例
运用 getClass()
注:每个 class 都有此函数
String str = "abc";
Class c1 = str.getClass();
运用
Button b = new Button();
2

Class.getSuperclass()
2
Class c1 = b.getClass();
Class c2 = c1.getSuperclass();
运用 static method
Class.forName()
(最常被使用)
Class c1 = Class.forName
("java.lang.String");
Class c2 = Class.forName
("java.awt.Button");
Class c3 = Class.forName
("java.util.LinkedList$Entry");
Class c4 = Class.forName ("I");
Class c5 = Class.forName ("[I");
运用
.class 语法
Class c1 = String.class;
Class c2 = java.awt.Button.class;
Class c3 = Main.InnerClass.class;
Class c4 = int.class;
Class c5 = int[].class;
运用
primitive wrapper
classes
的 TYPE 语法
%
Class c1 = Boolean.TYPE;
Class c2 = Byte.TYPE;
Class c3 = Character.TYPE;
Class c4 = Short.TYPE;
Class c5 = Integer.TYPE;
Class c6 = Long.TYPE;
Class c7 = Float.TYPE;
Class c8 = Double.TYPE;
Class c9 = Void.TYPE;
图 2:Java 允许多种管道生成 Class object。
Java classes 组成分析
首先容我以图 3 的 java.util.LinkedList 为例,将 Java class 的定义大卸八
块,每一块分别对应图 4 所示的 Reflection API。图 5 则是“获得 class 各区块信
息”的程序示例及执行结果,它们都取自本文示例程序的对应片段。
package java.util; %%%%%%%%%%%%%%%% %%% //(1)
import java.lang.*; %%%%%%%%%%%%%%% %%% //(2)
public class LinkedList<E> %%%%%%%% %%% //(3)(4)(5)
extends AbstractSequentialList<E> %%%%% //(6)
implements List<E>, Queue<E>,
Cloneable, java.io.Serializable %%%%%%% //(7)
{
private static class Entry<E> { … }//(8)
public LinkedList() { … } %%%%%%%%% //(9)
public LinkedList(Collection<? extends E> c) { … }
public E getFirst() { … } %%%%%%%%% //(10)
3
剩余18页未读,继续阅读
资源评论

- icanyoucan2016-06-16写得还行吧。

runner9999
- 粉丝: 4
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 2023年电大计算机基础考试答案考点版基础知识.doc
- java实验策略模式观察者模式和组合模式.doc
- 大型央企项目管理标准化手册(14页表格组织图齐全).pdf
- 2023年网络工程师模拟.doc
- excel表格专题复习公开课获奖课件.pptx
- 2023年C语言笔试题C笔试题大全14附答案.doc
- java实习期工作总结.docx
- XX软件实训心得体会.doc
- WCDMA网络容量码字资源.docx
- cad极坐标是怎么输入的参考.doc
- DreamweaverCS3自带快捷键大全.doc
- C语言程序设计基本概念ppt课件.ppt
- 2022软件公司实习报告_.docx
- 操作系统课程基于网络考核方案.doc
- 2023年电大计算机论文高中计算机论文大学计算机基础论文引领式教学模式的实践与探索.doc
- PNN神经网络评价方法本科设计说明.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
