快速业务通道

反射实践 - 编程入门网

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

反射实践

时间:2011-08-09 Albert Attard

您是否考虑过这些问题: IDE 如何列出类的所有详细信息,包括私有字段和私有方法? IDE 还能够 列出 JAR 文件中的类(及其详细信息),它们是如何做到的?

下面是反射的一些例子。

本文将阐述如何在编程中应用反射,以及如何在高级抽象中应用反射。我们将从一个十分简单的例子 入手,然后创建一个简单的程序来使用反射。

什么是反射?

反射是一种机制,它允许动态地发现和绑定类、方法、字段,以及由语言组成的所有其他元素。列出 类、字段和方法只是反射的基本应用。通过反射,我们实际上还能够在需要时创建实例、调用方法以及访 问字段。

大多数程序员曾使用过动态类载入技术来载入他们的 JDBC 驱动程序。这种载入方法类似于下面这一 段动态载入 MySQL JDBC 驱动程序实例的代码片段:

Class.forName("com.mysql.jdbc.Driver").newInstance();

使用反射的原因和时机

反射提供了一个高级别的抽象。换句话说,反射允许我们在运行时对手头上的对象进行检查并进行相 应的操作。例如,如果您必须在多种对象上执行相同的任务,如搜索某个实例。则可以为每种不同的对象 编写一些代码,也可以使用反射。或许您已经意识到了,反射可以减少近似代码的维护量。因为使用了反 射,您的实例搜索代码将会对其他类起作用。我们稍后会谈到这个示例。我已经将它加入到这篇文章里, 以便向您展示我们如何从反射中获益。

动态发现

下面我们从发现一个类的内容并列出它的构造、字段、方法开始。这并不实用,但它能让我们直观地 了解反射 API 的原理及其他内容。

创建 Product 类,如下所示。我们的所有示例都保存在名为 ria 的程序包中。

package ria; public class Product {   private String description;   private long id;   private String name;   private double price;   //Getters and setters are omitted for shortness }

反射实践(2)

时间:2011-08-09 Albert Attard

创建好 Product 类后,我们下面继续创建第二个类,名为 ReflectionUtil,它将列出第一个类的 (Product) 详细信息。或许您已经预料到了,这个类会包含一些实用的方法,这些方法将执行这个应用程 序中所需的所有反射功能。目前,这个类将只包含一个方法 describeInstance(Object),它具有一个类 型为 Object 的参数。

下面的清单中演示了 ReflectionUtil 类的代码。

package ria; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectionUtil {   public static void describeInstance(Object object) {    Class<?> clazz = object.getClass();    Constructor<?>[] constructors = clazz.getDeclaredConstructors();    Field[] fields = clazz.getDeclaredFields();    Method[] methods = clazz.getDeclaredMethods();    System.out.println("Description for class: " + clazz.getName());    System.out.println();    System.out.println("Summary");    System.out.println("-----------------------------------------");    System.out.println("Constructors: " + (constructors.length));    System.out.println("Fields: " + (fields.length));    System.out.println("Methods: " + (methods.length));    System.out.println();    System.out.println();    System.out.println("Details");    System.out.println("--------------------------------------

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号