- 什么是内省?
- JDK给JavaBean提供的API称为内省。
- 内省(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?
- 一个JavaBean类可以不当JavaBean用,而当成普通类用。
- JavaBean实际就是一种规范,当一个类满足这个规范,这个类就能被其它特定的类调用。
- 一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。
- 去掉set前缀,然后取剩余部分,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。
- 下面就用前面的讲解的反射方式来设置或读取JavaBean的属性:
- imp<wbr>ort java.beans.BeanInfo;</wbr>
- imp<wbr>ort java.beans.IntrospectionException;</wbr>
- imp<wbr>ort java.beans.Introspector;</wbr>
- imp<wbr>ort java.beans.PropertyDescriptor;</wbr>
- 除了反射用到的类需要引入外,内省需要引入的类如上所示,它们都属于java.beans包中的类,自己写程序的时候也不能忘了引入相应的包或者类。下面代码片断是一个设置某个JavaBean类某个属性的关键代码:
private static void setObjectProperty(ReflectPoint pt1, int value,String propName) throws IntrospectionException, IllegalAccessException, InvocationTargetException {
/*BeanInfo bean = Introspector.getBeanInfo(ReflectPoint.class);
PropertyDescriptor [] properties = bean.getPropertyDescriptors();
for(PropertyDescriptor property: properties)
{
if(property.getName().equals(propName))
{
Method mSetX = property.getWriteMethod();
mSetX.invoke(pt1, value);
break;
}
}*/
PropertyDescriptor property = new PropertyDescriptor("x",ReflectPoint.class);
Method mSetX = property.getWriteMethod();
mSetX.invoke(pt1, value);
}
- JavaBean有什么好处?
- JavaEE开发中,很多环境要求使用JavaBean方式进行操作。
- 两个模块传递多个信息,需要把这些信息封装成一个JavaBean中,称为值对象(传递值的对象,简写为VO)。
- 我们又通常把javabean的实例对象称之为值对象(Value Object),因为这些bean中通常只有一些信息字段和存储方法,没有功能性方法。
- 总结:
- 代码中注释的语句代表一种方式,最后的三行代表另外一种设置相应类相应属性的方式。
- 从简洁上来说,第二种方式显然更优雅。第一种方式中首先是获得相应javaBean的类信息bean,用的BeanInfo这个类来描述的。然后就能够通过getPropertyDescriptors方法获取属性描述数组对象。最后从数组中取去一个个的属性对象进行操作——获取相应的读写方法,然后调用相应的读写方法。这些是通过反射机制做到的。由于这种方式比较麻烦,如果只调用其中一种方法,就要遍历一次属性描述数组,所以就产生了第二种方式,直接通过传入属性名称,相应的javaBean类型参数,构造出一个需要的PropertyDescriptor对象,然后再进行调用。
- 理解了相应的原理,那些现成的工具用起来就会更舒服,如Beanutils与PropertyUtils工具。这两个工具设置属性的时候一个主要区别是PropertyUtils.getPropety方法获得的属性值的类型为该属性本来的类型,而BeanUtils.getProperty则是将该属性的值转换成字符串后才返回。
-
另:beanutils工具包
- 使用beanutils工具包操作JavaBean(需导入beanutils工具包和logging日志包):
- BeanUtils.getProperty(pt1,"x");
- BeanUtils.setProperty(pt1,"x","9");
- get属性时返回的结果为字符串,set属性时可以接受任意类型的对象,通常使用字符串。
- /*
- Java7新特性:
- Map map = {name:"xxx",age:18};
- BeanUtils.setProerty(map,"name","lhm");
- */
- PropertyUtils.getProperty(pt1,"x");
- PropertyUtils.setProperty(pt1,"x",9);
- get属性时返回的结果为该属性本来的类型,set属性时只接受该属性本来的类型。
分享到:
相关推荐
【IT十八掌徐培成】Java基础第25天-03.递归获取所有超类-内省获取所有属性-getter-setter.zip
内省机制
它是使用和编写的,因此可以在所有具有 GObject 内省绑定的语言中使用。依赖关系为了构建和使用 vector-tile-glib,您需要安装以下内容: 吉奥libprotobuf-c 开罗班戈开罗protoc-c 柠檬柔性建造像这样构建库: $ ./...
非专业程序员的编程 ........................... 4 嵌入式系统 ......... 4 分布式系统 ......... 5 组件软件 ..................... 5 结构 ........6 概述....... 6 程序(Programs) ................... 6 通讯...
内省高吞吐量测序(HTS)文件集并生成tsv和json数据集 用法 metadataFromHTSfileOfFiles.py [-h] [-i [I]] [-l [L]] [-t [T]] [-j [J]] 收集由文件定向的元数据数据集,该文件包含hts(bam)文件的路径,每行一个...
虚拟机内省技术研究,杨先强,双锴,随着云计算的流行,虚拟机内省(Virtual Machine Introspection, VMI)技术及工具逐渐被用来监控IaaS云中虚拟机的行为。在这些技术的帮助下,�
Servlet调试支持:内省请求,会话和Servlet上下文的内容,将数据HTML表示形式附加到引擎服务HTML页面。 用于自省和可视化目的的策略是可插入的。
内含commons-beanutils-1.9.2.jar,commons-logging-1.2.jar
12.6. 以 WSDL 进行 SOAP 内省 12.7. 搜索 Google 12.8. SOAP 网络服务故障排除 12.9. 小结 13. 单元测试 13.1. 罗马数字程序介绍 II 13.2. 深入 13.3. romantest.py 介绍 13.4. 正面测试 (Testing for ...
return-to-abort() - 使用代码内省来防止堆栈崩溃
10.2 用::限定符来使用变量和过程.62 10.3 名字空间的变量 63 10.4 过程的进口与出口64 10.5 内省(INTROSPECTION) 65 10.6 名字空间命令集 65 第 11 章. 跟踪与调试. 67 11.1 CLOCK命令..67 11.1.1 clock ...
4.9反射内省.txt.xmind
Container内省(Introspection)工具,能找出正在使用的容器运行时以及可用的功能
特别详细的java内省思维导图,全方面介绍java内省的功能以及用法用处。
schemagen-graphql.zip,这提供了类型内省和从pojos.graphql-java附加组件生成graphql,该附加组件增加了对企业级应用程序的模式生成和执行的支持。
使用python内省功能为gi模块创建sphinx文档的工具。 pgi-docgen create内省gi模块, pgi-docgen create gir文档并创建一个狮身人面像环境。 pgi-docgen build使用sphinx构建html文档。要求的Python 3 pgi(行李箱)...
一个(即将推出)功能齐全的 MySQL 数据库内省工具,用于将 MySQL 数据库逆向工程(转换)为 Python 对象。 它使用来自 Coleifer 的 Peewee(从或) 即使 Pwiz 存在,我还是在知道它之前编码了这个转换器。 我继续...
BeastForm-内省数据库并动态生成模型 版本 版本0.000001 概要 use BeastForm; use Mojolicious::Lite; get "/" => sub { $_[0]->stash( drivers => BeastForm::drivers ); $_[0]->render( template => "form....
小议布赖恩·温的公众理解科学理论研究内省模型.doc
一个小镜像类,用于使用类型化数组内省 JS 数字的位模式。 例子: Math . PI . introspect ( ) . mantissa ; // "1001001000011111101101010100010001000010110100011000" Math . E . introspect ( ) . exponent...