`

候捷谈Java反射机制

阅读更多

Java 反射机制 <!----> <o:p> </o:p>

<o:p>   </o:p>

摘要<o:p></o:p>

Reflection Java 被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过 Reflection APIs 取得任何一个已知名称的 class 的内部信息,包括其 modifiers (诸如 public, static 等等)、 superclass (例如 Object )、实现之 interfaces (例如 Cloneable ),也包括 fields methods 的所有信息,并可于运行时改变 fields 内容或唤起 methods 。本文借由实例,大面积示范 Reflection APIs <o:p> </o:p>

<o:p>   </o:p>

关于本文:<o:p></o:p>

读者基础:具备 Java 语言基础。 <o:p> </o:p>

本文适用工具: JDK1.5<o:p></o:p>

<o:p>   </o:p>

关键词:<o:p></o:p>

Introspection (内省、内观) <o:p> </o:p>

Reflection (反射) <o:p> </o:p>

<o:p>   </o:p>

<o:p>   </o:p>

有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定( dynamic binding )、动态链接( dynamic linking )、动态加载( dynamic loading )等。然而 动态 一词其实没有绝对而普遍适用的严格定义,有时候甚至像对象导向当初被导入编程领域一样,一人一把号,各吹各的调。 <o:p> </o:p>

<o:p>   </o:p>

一般而言,开发者社群说到动态语言,大致认同的一个定义是: 程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言 。从这个观点看, Perl Python Ruby 是动态语言, C++ Java C# 不是动态语言。 <o:p> </o:p>

<o:p>   </o:p>

尽管在这样的定义与分类下 Java 不是动态语言,它却有着一个非常突出的动态相关机制: Reflection 。这个字的意思是 反射、映象、倒影 ,用在 Java 身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的 classes 。换句话说, Java 程序可以加载一个运行时才得知名称的 class ,获悉其完整构造(但不包括 methods 定义),并生成其对象实体、或对其 fields 设值、或唤起其 methods 1 。这种 看透 class 的能力( the ability of the program to examine itself )被称为 introspection 内省、内观、反省 )。 Reflection introspection 是常被并提的两个术语。 <o:p> </o:p>

<o:p>   </o:p>

Java 如何能够做出上述的动态特性呢?这是一个深远话题,本文对此只简单介绍一些概念。整个篇幅最主要还是介绍 Reflection APIs ,也就是让读者知道如何探索 class 的结构、如何对某个 运行时才获知名称的 class 生成一份实体、为其 fields 设值、调用其 methods 。本文将谈到 java.lang.Class ,以及 java.lang.reflect 中的 Method Field Constructor 等等 classes <o:p> </o:p>

<o:p>   </o:p>

Class class<o:p></o:p>

众所周知 Java 有个 Object class ,是所有 Java classes 的继承根源,其内声明了数个应该在所有 Java class 中被改写的 methods hashCode() equals() clone() toString() getClass() 等。其中 getClass() 返回一个 Class object <o:p> </o:p>

<o:p>   </o:p>

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 标准库源码的改动办法。 <o:p> </o:p>

<o:p>   </o:p>

Class Reflection 故事起源。针对任何您想探勘的 class ,唯有先为它产生一个 Class object ,接下来才能经由后者唤起为数十多个的 Reflection APIs 。这些 APIs 将在稍后的探险活动中一一亮相。 <o:p> </o:p>

<o:p>   </o:p>

#001 public final<o:p></o:p>

#002 class Class <T> implements java.io.Serializable,<o:p></o:p>

#003 java.lang.reflect.GenericDeclaration,<o:p></o:p>

#004 java.lang.reflect.Type,<o:p></o:p>

#005 java.lang.reflect.AnnotatedElement {<o:p></o:p>

#006    private

分享到:
评论

相关推荐

    反射机制

    这篇《候捷谈Java反射机制》的文章应该深入探讨了这一主题。 反射的核心概念主要包括Class类、Constructor类、Method类和Field类。以下是对这些关键知识点的详细说明: 1. **Class类**:在Java中,每个类都有一个...

    候捷的java精髓

    7. **反射机制**:深入理解Java反射的概念,如何在运行时动态访问类、接口、方法和构造器。 8. **设计模式**:讲解常用的设计模式,如单例、工厂、观察者、装饰者、代理等,以及如何在实际开发中应用。 9. **JVM...

    侯捷-Java编程思想+第2版(繁体版)

    - **异常处理**:详细讲解Java中的异常处理机制,包括异常的抛出、捕获及处理策略,帮助开发者编写健壮的应用程序。 - **泛型与集合框架**:重点介绍了Java泛型的概念及其在集合框架中的应用,使开发者能够写出类型...

    北京金卫捷科技发展有限公司Java笔试题

    7. **反射机制**:利用反射动态获取类的信息,创建对象,调用方法,修改字段值,了解Class类和Method类的使用。 8. **设计模式**:常见的设计模式如工厂模式、单例模式、观察者模式、装饰者模式等,理解其应用场景...

    Practical Java一书及代码

    8. **反射与动态代理**:Java的反射机制能让我们在运行时检查类的信息并操作对象,动态代理则能在运行时创建具有特定接口的代理类,这对于AOP(面向切面编程)和插件式系统很有用。 9. **Java EE基础**:虽然不是...

    Android程序员简历最新版

    2. **Java技术**:精通Java核心技术,包括反射、集合、网络编程和IO流的使用。 3. **Web应用开发**:熟练运用jsp、servlet、JSTL/EL、dom4j和JDBC,具备Struts2、Spring、Hibernate等主流框架的实践经验。 4. **...

Global site tag (gtag.js) - Google Analytics