快速业务通道

Java编程的动态性,第2部分: 引入反射 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

Java编程的动态性,第2部分: 引入反射

时间:2011-04-09 IBM Dennis M. Sosnoski

在“ Java编程的动态性,第1部分,”我为您介绍了Java编程类和类装入。该篇文章介绍 了一些Java二进制类格式的相关信息。这个月我将阐述使用Java反射API来在运行时接入和使 用一些相同信息的基础。为了使已经熟知反射基础的开发人员关注本文,我将在文章中包括 反射性能如何与直接接入相比较。

使用反射不同于常规的Java编程,其中它与 元数据--描述其它数据的数据协作。Java语 言反射接入的特殊类型的原数据是JVM中类和对象的描述。反射使您能够运行时接入广泛的类 信息。它甚至使您能够读写字段,调用运行时选择的类的方法。

反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需 在组件之间进行源代表链接。但反射的某些方面存在一些疑问。在本文中,我将深入讨论为 什么您可能 不希望在程序中使用反射,以及您应该这样做的理由。在了解了权衡性分析之后 ,您可以自行决定是否利大于弊。

初学者的类

使用反射的启点总是 java.lang.Class 实例。如果您希望与预先定义的类协作,那么 Java语言提供一种直接获得 Class 实例的简便快捷方式:

Class clas = MyClass.class;

当您使用这一项技术时,装入类涉及的所有工作在幕后进行。但是,如果您需要在运行时 从某些外部源读取类名,这种方法并不适合。实际上,您需要使用一个类装入器来查找类信 息。以下介绍一种方法:

// "name" is the class name to load Class clas = null; try {   clas = Class.forName(name); } catch (ClassNotFoundException ex) {   // handle exception case } // use the loaded class

如果已经装入了类,您将得到现有的 Class 信息。如果类未被装入,类装入器将现在装 入并返回新创建的类实例。

基于类的反射

Class 对象为您提供接入类元数据的反射的所有基本hook。这类元数据包括关于类自身的 信息,如包和类的父类,以及该类实施的接口。它还包括该类定义的构造函数、字段和方法 的详细信息。这些最后的项目都是编程中最经常使用的项目,因此我将在本小节的稍后部分 给出一些与它们协作的实例。

对于以下三类组件中的任何一类来说 -- 构造函数、字段和方法 -- java.lang.Class 提 供四种独立的反射调用,以不同的方式来获得信息。调用都遵循一种标准格式。以下是用于 查找构造函数的一组反射调用:

Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造 函数,

Constructor[] getConstructors() -- 获得类的所有公共构造函数

Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构 造函数(与接入级别无关)

Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关 )

每类这些调用都返回一个或多个 java.lang.reflect.Constructor 函数。这种 Constructor 类定义 newInstance 方法,它采用一组对象作为其唯一的参数,然后返回新创 建的原始类实例。该组对象是用于构造函数调用的参数值。作为解释这一工作流程的实例, 假设您有一个 TwoString 类和一个使用一对 String s的构造函数,如清单1所示:

清单1:从一对字符串创建的类&#160

public class TwoString {    private String m_s1, m_s2;    public TwoString(String s1, String s2) {      m_s1 = s1;      m_s2 = s2;    } }

Java编程的动态性,第2部分: 引入反射(2)

时间:2011-04-09 IBM Dennis M. Sosnoski

清单2中的代码获得构造函数并使用它来创建使用 String s "a"

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号