`
hacker_zxf
  • 浏览: 148811 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[转]JAVA语言的反射和内省

阅读更多
转自: http://blog.csdn.net/daoquan/archive/2006/03/17/627810.aspx

很多朋友在深入的接触JAVA语言后就会发现这样两个词:反射(Reflection)和内省(Introspector),经常搞不清楚这到底是怎么回事,在什么场合下应用以及如何使用?今天把这二者放在一起介绍,因为它们二者是相辅相成的。

反射


相对而言,反射比内省更容易理解一点。用一句比较白的话来概括,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术。例如我们可以通过类名来生成一个类的实例;知道了方法名,就可以调用这个方法;知道了属性名就可以访问这个属性的值。

还是写两个例子让大家更直观的了解反射的使用方法:


//通过类名来构造一个类的实例
Class cls_str = Class.forName("java.lang.String");
//上面这句很眼熟,因为使用过JDBC访问数据库的人都用过J
Object str = cls_str.newInstance();
//相当于 String str = new String();


//通过方法名来调用一个方法
String methodName = "length";
Method m = cls_str.getMethod(methodName,null);
System.out.println("length is " + m.invoke(str,null));
//相当于System.out.println(str.length());



上面的两个例子是比较常用方法。看到上面的例子就有人要发问了:为什么要这么麻烦呢?本来一条语句就完成的事情干吗要整这么复杂?没错,在上面的例子中确实没有必要这么麻烦。不过你想像这样一个应用程序,它支持动态的功能扩展,也就是说程序不重新启动但是可以自动加载新的功能,这个功能使用一个具体类来表示。首先我们必须为这些功能定义一个接口类,然后我们要求所有扩展的功能类必须实现我指定的接口,这个规定了应用程序和可扩展功能之间的接口规则,但是怎么动态加载呢?我们必须让应用程序知道要扩展的功能类的类名,比如是test.Func1,当我们把这个类名(字符串)告诉应用程序后,它就可以使用我们第一个例子的方法来加载并启用新的功能。这就是类的反射,请问你有别的选择吗?


       关于方法的反射建议大家看我的另外一篇文章《利用Turbine的事件映射来扩展Struts的功能》,地址是:http://www.javayou.com/article/CSDN/extend_struts.html。这篇文章详细介绍了如果通过反射来扩展Struts框架的功能。


内省


内省是Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新的值。通过getName/setName来访问name属性,这就是默认的规则。Java中提供了一套API用来访问某个属性的getter/setter方法,通过这些API可以使你不需要了解这个规则(但你最好还是要搞清楚),这些API存放于包java.beans中。


一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来调用这些方法。下面我们来看一个例子,这个例子把某个对象的所有属性名称和值都打印出来:


/* 
 * Created on 2004-6-29
 */

package demo;


import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;


/**
 * 内省演示例子
 * @author liudong
 */

public class IntrospectorDemo {
    String name;
    public static void main(String[] args) throws Exception{
        IntrospectorDemo demo = new IntrospectorDemo();
        demo.setName("Winter Lau");       

        //如果不想把父类的属性也列出来的话,
        //那getBeanInfo的第二个参数填写父类的信息
        BeanInfo bi = Introspector.getBeanInfo(demo.getClass(),Object.class);
        PropertyDescriptor[] props = bi.getPropertyDescriptors();
        for(int i=0;i<props.length;i++){
            System.out.println(props[i].getName()+"="+
                    props[i].getReadMethod().invoke(demo,null));
        }

    }   

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}



Web开发框架Struts中的FormBean就是通过内省机制来将表单中的数据映射到类的属性上,因此要求FormBean的每个属性要有getter/setter方法。但也并不总是这样,什么意思呢?就是说对一个Bean类来讲,我可以没有属性,但是只要有getter/setter方法中的其中一个,那么Java的内省机制就会认为存在一个属性,比如类中有方法setMobile,那么就认为存在一个mobile的属性,这样可以方便我们把Bean类通过一个接口来定义而不用去关系具体实现,不用去关系Bean中数据的存储。比如我们可以把所有的getter/setter方法放到接口里定义,但是真正数据的存取则是在具体类中去实现,这样可提高系统的扩展性。


总结


将Java的反射以及内省应用到程序设计中去可以大大的提供程序的智能化和可扩展性。有很多项目都是采取这两种技术来实现其核心功能,例如我们前面提到的Struts,还有用于处理XML文件的Digester项目,其实应该说几乎所有的项目都或多或少的采用这两种技术。在实际应用过程中二者要相互结合方能发挥真正的智能化以及高度可扩展性。
分享到:
评论

相关推荐

    java反射全解(反射原理+反射API详解+反射与数组+反射与泛型+反射源码与性能开销+反射优缺点+反射与内省)

    java 反射机制是 Java 语言中的一种动态获取信息和调用对象方法的技术核心。它允许在程序运行时加载、探索以及使用编译期间完全未知的 .class 文件。通过反射机制,可以在运行时判断任意一个对象所属的类、构造任意...

    Java反射与内省-PPT

    Java反射与内省是Java编程语言中的核心特性,它们为开发者提供了强大的能力,可以在运行时检查和操作类、接口、对象及其属性。本PPT深入探讨了这些概念,旨在帮助开发者充分利用Java平台的灵活性。 首先,Java反射...

    java面试题--反射机制

    这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射机制的核心概念、基本原理及其应用场景。 #### 二、Java反射机制简介 Java反射机制允许...

    Java中的内省与反射.doc

    在深入了解Java语言的过程中,我们会遇到两个重要的概念:反射和内省。这两种技术在实际开发中有着广泛的应用,尤其是在需要进行动态操作或元数据处理的场景下尤为重要。本文将详细介绍这两者的基本原理、应用场景...

    候捷谈Java反射机制

    Java反射机制是Java编程语言...总之,Java反射机制是Java语言中一个强大的工具,它增强了Java的灵活性,允许开发者在运行时探索和操作类的内部结构。尽管反射带来了诸多便利,但也需要合理使用,以平衡灵活性和稳定性。

    JAVA的内省机制(introspector)与反射机制(reflection).docx

    内省机制和反射机制都是 JAVA 语言提供的一些机制,用于访问和操作对象的属性和方法。但是,它们有着不同的机理和应用场景。内省机制主要用于访问某个 Bean 的属性和事件,而反射机制则可以用于访问和操作任何对象的...

    java反射原理

    总结来说,Java反射机制是Java语言的一个重要特性,它允许程序在运行时动态地加载、检测和使用类信息,极大地增强了Java的灵活性和扩展性。然而,正如任何强大工具一样,反射机制的使用也需遵循一定的原则,避免滥用...

    JAVA反射侯捷观点

    本文适合具备Java语言基础的读者阅读,主要使用JDK1.5,并涉及关键词Introspection(内省)和Reflection(反射)。内省是指程序自我检查和理解的能力,而反射则是这一能力的具体实现,它使Java程序能够在运行时加载...

    java反射机制.pdf

    ### Java反射机制详解 #### 一、引言 Java反射机制是Java语言中一项重要的功能,使得Java在一定程度上具备了动态语言的特性。通过Java反射机制,可以...了解并掌握Java反射机制对于深入理解和使用Java语言非常重要。

    Java语言程序设计源代码

    这可能包括反射、注解、枚举、内省等Java的高级特性,这些特性在实际开发中非常有用,能帮助程序员实现更灵活和强大的功能。 每个章节的源代码和课后习题答案都是深入理解Java语言的好帮手。通过练习和解答,学习...

    Java 内省(Introspector)深入理解

    Java内省(Introspector)是Java语言提供的一种机制,用于在运行时分析Java对象的属性、方法和事件。这个特性对于开发人员来说非常有用,因为它允许程序动态地检查和修改对象的状态,而不必了解对象的具体实现细节。...

    minimalcode-reflect:JavaBean 的简约反射和内省功能

    在Java编程语言中,反射和内省是两个强大的特性,它们允许程序在运行时检查类、接口、字段和方法的信息,甚至动态地调用方法和访问属性。"minimalcode-reflect"项目提供了一个简约的框架,专注于JavaBean的反射和...

    javaSpecification(1,2,3)

    随着Java的不断发展,第二版规范(JLS 2nd Edition)涵盖了Java 1.1和1.2的主要更新,包括集合框架的引入、内省(Introspection)能力的增强、反射(Reflection)API的完善,以及新的I/O流和网络编程API。...

    C++反射机制实现

    由于Java和.NET平台上反射技术的成功应用,反射技术从理论研究走向了实用阶段,动态获取和调整系统行为的能力得到了强化。动态反射技术尤其在需要编写扩展性较强的代码,处理程序设计时不确定的对象方面表现出了显著...

    内省所需jar包

    - 框架开发:许多Java框架如Spring,Struts等利用内省和BeanUtils来实现依赖注入和控制反转。 了解和掌握内省、Apache Commons BeanUtils以及Commons Logging,对于提高Java开发效率和编写更灵活的代码至关重要。...

    java5在线版和离线版

    Java 5,全称为Java 2 ...总的来说,Java 5在语言特性和并发编程方面做出了显著的改进,为后来的Java版本奠定了坚实的基础。尽管现在已经有了更新的Java版本,但理解Java 5的知识对于深入学习Java编程仍然是必要的。

    Thinking in Java 4 源码 导入IDEA可直接运行

    这本书深入浅出地介绍了Java语言的核心概念和技术,包括面向对象编程、集合框架、多线程、网络编程等众多主题。源码是书中理论知识的实践体现,对于学习和理解Java编程有着极大的帮助。 源码分享提供了直接导入IDEA...

Global site tag (gtag.js) - Google Analytics