`
cloudtech
  • 浏览: 4594304 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Java内省机制

 
阅读更多

Java内省机制

2009-11-27 16:04:24|分类:Java学习|字号订阅

内省(IntroSpector)是Java 语言对 Bean 类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中,一般的做法是通过类 Introspector 的 getBeanInfo方法 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。

我们又通常把javabean的实例对象称之为值对象(Value Object),因为这些bean中通常只有一些信息字段和存储方法,没有功能性方法。

一个JavaBean类可以不当JavaBean用,而当成普通类用。JavaBean实际就是一种规范,当一个类满足这个规范,这个类就能被其它特定的类调用。一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。去掉set前缀,然后取剩余部分,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。下面就用前面的讲解的反射方式来设置或读取JavaBean的属性:
imp<wbr>ort java.beans.BeanInfo;<br> imp<wbr>ort java.beans.IntrospectionException;<br> imp<wbr>ort java.beans.Introspector;<br> imp<wbr>ort java.beans.PropertyDescriptor;<br> 除了反射用到的类需要引入外,内省需要引入的类如上所示,它们都属于java.beans包中的类,自己写程序的时候也不能忘了引入相应的包或者类。下面代码片断是一个设置某个JavaBean类某个属性的关键代码:<br> private static void setObjectProperty(ReflectPoint pt1, int value,String propName) throws IntrospectionException,IllegalAccessException, InvocationTargetException {<br> /*BeanInfo bean = Introspector.getBeanInfo(ReflectPoint.class);<br> PropertyDescriptor [] properties = bean.getPropertyDescriptors();<br> for(PropertyDescriptor property: properties)<br> {<br> if(property.getName().equals(propName))<br> {<br> Method mSetX = property.getWriteMethod();<br> mSetX.invoke(pt1, value);<br> break;<br> }<br> }*/<br> PropertyDescriptor property = new PropertyDescriptor("x",ReflectPoint.class);<br> Method mSetX = property.getWriteMethod();<br> mSetX.invoke(pt1, value);<br> }<br> 代码中注释的语句代表一种方式,最后的三行代表另外一种设置相应类相应属性的方式。从简洁上来说,第二种方式显然更优雅。第一种方式中首先是获得相应javaBean的类信息bean,用的BeanInfo这个类来描述的。然后就能够通过getPropertyDescriptors方法获取属性描述数组对象。最后从数组中取去一个个的属性对象进行操作——获取相应的读写方法,然后调用相应的读写方法。这些是通过反射机制做到的。由于这种方式比较麻烦,如果只调用其中一种方法,就要遍历一次属性描述数组,所以就产生了第二种方式,直接通过传入属性名称,相应的javaBean类型参数,构造出一个需要的PropertyDescriptor对象,然后再进行调用。<br> 理解了相应的原理,那些现成的工具用起来就会更舒服,如Beanutils与PropertyUtils工具。这两个工具设置属性的时候一个主要区别是PropertyUtils.getPropety方法获得的属性值的类型为该属性本来的类型,而BeanUtils.getProperty则是将该属性的值转换成字符串后才返回。</wbr></wbr></wbr></wbr>

分享到:
评论

相关推荐

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

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

    java反射机制介绍

    java有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才...

    候捷谈Java反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...

    Java反射与内省-PPT

    JAVA反射机制、注解、动态加载类、动态调用对象方法

    java反射机制 读者基础:具备Java 语言基础

    这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public,static 等等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和...

    06-内省.xmind

    内省机制

    java项目应用中自定义sql在ibaits框架中的使用.docx

    该文章介绍了自定义sql在ibaits应用,并描述了自己在实现过程中遇到的问题及解决过程,望能遇到同样问题的你提供参考

    NewsCrusader

    提供一个索引内省机制,以后可以在此基础上构建以支持查询。 实现可以将自由文本解析为结构化查询词的查询解析器 实现一个查询机制,可以摄取查询词并找到匹配的文档 实施两种流行的评分机制来对检索到的文档进行...

    Tcl_TK编程权威指南pdf

    内省(introspection) namespace命令 转换现有的软件包以使用名字空间 [incrtcl]对象系统 注意事项 第15章 国际化(internationalization) 字符集与编码 消息目录 第16章 事件驱动的编程 tcl事件循环 ...

Global site tag (gtag.js) - Google Analytics