Java读书笔记十一(Java中的内省机制)
来源:互联网 发布:python socket 短连接 编辑:程序博客网 时间:2024/05/13 19:28
1.前言
最近在学习Java的时候,突然发现了这个概念,鉴于好奇心的压迫,于是打算写一篇博客来总结一下。
2.什么是内省机制
为了让程序员们更好的从左Java对象的属性,SUN公司开发了一套API,就被我们称为“内省”,有利于我们对类对象的属性的操作,减少了代码的数量。
3.内省和反射有什么区别
反射式在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态。
内省机制是通过反射来实现的,BeanInfo用来暴露一个bean的属性、方法和事件,以后我们就可以操纵该JavaBean的属性
4.一张图总结
在Java内省中,用到的基本上就是上述几个类。
通过BeanInfo这个类就可以获取到类中的方法和属性,具体的可以参考JDK文档
5.Demo展示
5.1.通过PropertyDescriptor修改属性方式
package com.query;import java.beans.PropertyDescriptor;import java.lang.reflect.Method;public class BeanInfoUtil {public static void setProperty(UserInfo userInfo,String userName)throws Exception{ PropertyDescriptor propDesc=new PropertyDescriptor(userName,UserInfo.class); Method methodSetUserName=propDesc.getWriteMethod(); methodSetUserName.invoke(userInfo, "wong"); System.out.println("set userName:"+userInfo.getUserName()); } public static void getProperty(UserInfo userInfo,String userName)throws Exception{ PropertyDescriptor proDescriptor =new PropertyDescriptor(userName,UserInfo.class); Method methodGetUserName=proDescriptor.getReadMethod(); Object objUserName=methodGetUserName.invoke(userInfo); System.out.println("get userName:"+objUserName.toString()); }}
5.2.通过Introspector类修改属性package com.query;import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.Method;public class BeanInfoUtil2 {public static void setPropertyByIntrospector(UserInfo userInfo,String userName) throws Exception {BeanInfo beanInfo = Introspector.getBeanInfo(UserInfo.class);PropertyDescriptor[] proDescrtptors = beanInfo.getPropertyDescriptors();if (proDescrtptors != null && proDescrtptors.length > 0) {for (PropertyDescriptor propDesc : proDescrtptors) {if (propDesc.getName().equals(userName)) {Method methodSetUserName = propDesc.getWriteMethod();methodSetUserName.invoke(userInfo, "alan");System.out.println("set userName:" + userInfo.getUserName());break;}}}}public static void getPropertyByIntrospector(UserInfo userInfo,String userName) throws Exception {BeanInfo beanInfo = Introspector.getBeanInfo(UserInfo.class);PropertyDescriptor[] proDescrtptors = beanInfo.getPropertyDescriptors();if (proDescrtptors != null && proDescrtptors.length > 0) {for (PropertyDescriptor propDesc : proDescrtptors) {if (propDesc.getName().equals(userName)) {Method methodGetUserName = propDesc.getReadMethod();Object objUserName = methodGetUserName.invoke(userInfo);System.out.println("get userName:" + objUserName.toString());break;}}}}}注意事项,在上述修改JavaBean属性的时候,如果数据类型不对的话,会报错。例如BeanInfoUtil.setProperty(userInfo, "age");报错是应为age属性是int数据类型,而setProperty方法里面默认给age属性赋的值是String类型。所以会爆出argument type mismatch参数类型不匹配的错误信息。
为了解决上述问题,Apache开发了一套简单、易用的API来操作Bean的属性——BeanUtils工具包。
BeanUtils工具包:下载:http://commons.apache.org/beanutils/ 注意:应用的时候还需要一个logging包http://commons.apache.org/logging/
- Java读书笔记十一(Java中的内省机制)
- java 中的内省机制
- 《JavaBean》----Java中的内省机制二
- java中的内省(Introspector)
- java内省机制运用
- Java内省机制
- java的内省机制
- Java内省机制
- java内省机制
- java内省机制
- java内省机制介绍
- Java内省机制
- Java内省机制
- Java内省机制
- java内省机制
- Java内省机制
- java 内省机制
- Java 内省机制
- Multiplexing
- Lock&Condition实现线程同步通信
- MYSQL问题解决方案:Access denied for user 'root'@'localhost' (using password:YES)
- 新发现的毛泽东24岁写的作文《心之力》
- C++学习笔记
- Java读书笔记十一(Java中的内省机制)
- iOS 图片与内存(转)
- 图像处理——光效公式
- 选择文件操作
- udp打洞过程
- 读书笔记:数据结构与算法分析(java语言描述)——引论
- iOS开发 代码创建UITabBarController
- Android无线连接打印第三方开发的实现
- 产品经理之UI设计——UI/UX设计趋势