由内省引出JavaBean的讲解
IntroSpector--内部检查,了解更多细节--内省---JavaBean
一、JavaBean
- JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用户访问私有的字段,且方法名符合某种命名规则。
- 如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object ,简称VO)。
这些信息学在类中用私有字段来存储,如果读取或者设置这些字段的值,这需要通过一些相应的方法来访问,大家觉得这些方法的名字叫什么好呢?
JavaBean的属性石根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,值域你把它存在哪个
变量上,用管吗?如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个
字母是小写的,则把剩余部分的首字母改成小的。
- setId()的属性名—>id
- isLast()的属性名—>last
- setCPU()的属性名—>CPU
- getUPS()的属性名—>UPS
总之,一个类被当做JavaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。
- 一个符合JavaBean特点的类可以当做一个普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和应用JavaBean!
好处如下:
- 在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,哪里就没有挑选的余地!
- JDK中提供了对JavaBean进行操作的一些API,这套API就成为内省。得到如果要你自己去通过getX方法来访问私有的x,怎么做,有一定难度吧?
用内省这套api操作JavaBean比用普通类的方式更方便。
二、内省综合案例
- 演示用eclipse自动生成ReflectPoint的setter和getter方法。
- 直接new一个PropertyDescriptor对象的方式来让大家了解JavaBean API的价值,先用一段代码读取JavaBean的属性,然后在用一段代码设置JavaBean的属性。
- package com.itcast.day2;
- import java.beans.PropertyDescriptor;
- import java.lang.reflect.Method;
- import com.itcast.day1.ReflectPoint;
- public class IntroSpectorTest {
- public static void main(String[] args) throws Exception{
- ReflectPoint rf1=new ReflectPoint(3,4);
- String propertyName="x";
- //如果不使用JavaBean API,则需要通过反射手动一步一步做,步骤为: 01."x"-->02."X"-->03."getX"-->04.MethodGetX-->
- //读
- PropertyDescriptor pd=new PropertyDescriptor(propertyName, rf1.getClass());
- Method methodGetX=pd.getReadMethod();//使用JavaBean API 至此,已经完成了 01、02、03、04,显然方便很多
- Object retVal=methodGetX.invoke(rf1);
- System.out.println(retVal);
- //写
- Object value=6;
- PropertyDescriptor pd2=new PropertyDescriptor(propertyName, rf1.getClass());
- Method methodSetX=pd.getWriteMethod();//使用JavaBean API 至此,已经完成了 01、02、03、04,显然方便很多
- methodSetX.invoke(rf1,value);
- System.out.println(rf1.getX());
- }
- }
- 演示用eclipse将读取属性和设置属性的流水账代码分别抽取成方法:
- 只要调用这个方法,并给这个方法传递一个对象、属性名和设置值,它就能完成属性修改的功能。
- 得到BeanInfo最好采用”obj.getClass()”方式,而不要采用”类名.class”方式,这样程序更通用。
- 采用遍历BeanInfo的所有属性方式来查找和设置某个ReflectPoint对象的x属性。在程序中把一个类当作JavaBean来看,就是调用IntroSpector.getBeanInfo方法,得到的BeanInfo对象封装了把这个类当作JavaBean看的结果信息。
//获得属性值得两种方式
- public static Object getProperty(Object rf1,
- String propertyName) throws IntrospectionException,
- IllegalAccessException, InvocationTargetException {
- //①现在的方式--简捷,好!O(∩_∩)O~~
- /*PropertyDescriptor pd=new PropertyDescriptor(propertyName, rf1.getClass());
- Method methodGetX=pd.getReadMethod();
- Object retVal=methodGetX.invoke(rf1);*/
- //②最早的方式--遍历查找,较麻烦 ̄へ ̄
- Object retVal=null;
- BeanInfo beanInfo=Introspector.getBeanInfo(rf1.getClass());
- PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();
- for(PropertyDescriptor pd:pds){
- if(pd.getName().equals(propertyName)){
- Method methodGetX=pd.getReadMethod();
- retVal=methodGetX.invoke(rf1);
- break;
- }
- }
- return retVal;
- }
由内省引出JavaBean的讲解的更多相关文章
- 由内省引出JavaBean的应用
IntroSpector-->javaBean-->特殊的java类 get和set方法 ReflectPoint pt1 = new ReflectPoint(3,5); String ...
- 内省(introspector)------>JavaBean
内省(introspector)------>JavaBean 1.问什么要学内省? 开发框架时,经常需要Java对象的属性来来封装程序的数据,每次使用反射技术完成此操作过于 ...
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性
本文转载自:http://blog.sina.com.cn/s/blog_5d65a16901011kom.html 关键字:内省.JavaBean.PropertyDescriptor类.Int ...
- 内省操作javabean的属性
import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector ...
- 内省与JavaBean
概述 JavaBean代表一类特殊的Java类,这种类主要用来存储和传递属性信息,JavaBean中的方法主要用于设置和获取这些私有属性,他们有一定的命名规则,我们可以把它们想象为一个侧重属性信息的类 ...
- java 内省 了解JavaBean
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则. 如果要在两个模块之间传递多个信息,可以将这些信息封装到一个Jav ...
- 黑马程序员_高新技术之javaBean,注解,类加载器
----------- android培训.java培训.java学习型技术博客.期待与您交流! ---------- 第一部分 javaBean 一,由内省引出javaBean 1,内省: 内省对应 ...
- 使用内省的方式操作JavaBean
import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; im ...
- java 深入技术八(内省)
1. javabean的软件设计思想 2.内省:封装了java反射,提供直接操作属性的Setter和getter方法的方法 3.核心API:BeanInfo java 的描述信息,Introspect ...
随机推荐
- postgresql 表继承
可以按如下语句创建表 CREATE TABLE capitals ( name text, population real, altitude int, -- (in ft) state ) ); C ...
- Visual Studio 2012 智能提示功能消失解决办法
安装为Visual Studio 2012且更新到了Update3,但是发现智能提示功能用不了,查了一下,网上各种资料,重装VS,连重装系统的都有.不过有很多朋友都是使用命令行重置VS的方法解决了这个 ...
- ionic的学习-01搭建App的起步准备
Part1 搭建App的起步准备(建立项目文件夹,配置开发环境) 第一步 初始化npm npm init 文件夹变化 第二步 使用npm安装git npm install git --save 文件 ...
- Jquery 跨域访问 Lightswitch OData Service
修改lightswitch .server project web.config.添加如下内容就可以实现对ApplicationData.svc/跨域访问 <system.webServer&g ...
- vuejs深入浅出—基础篇
一.从HelloWorld说起 任何语言的都是从Hello World开始的,VueJs也不例外,直接上代码: <script src="https://unpkg.com/vue/d ...
- 图片人脸检测——OpenCV版(二)
图片人脸检测 人脸检测使用到的技术是OpenCV,上一节已经介绍了OpenCV的环境安装,点击查看. 往期目录 视频人脸检测——Dlib版(六)OpenCV添加中文(五)图片人脸检测——Dlib版(四 ...
- Gulp Error: Cannot find module 'jshint/src/cli'
I'm following sitepoint's An introduction to Gulp.js, but I'm stuck on step four, when I try to run ...
- JAVAEmail工具错误java.lang.ClassNotFoundException: javax.activation.DataSource
JDK9以上或JDK6以下使用mail.jar包不加JAF的activation.jar包会抛出该错误!JDK6以上不需要加该jar包: 参考原文 https://stackoverflow.com/ ...
- java_二进制的前导的零
题目内容: 计算机内部用二进制来表达所有的值.一个十进制的数字,比如18,在一个32位的计算机内部被表达为00000000000000000000000000011000.可以看到,从左边数过来,在第 ...
- 性能监控(1)--linux下的top命令
Linux下的监控工具 top命令 top命令能够实时显示系统中各个进程的资源占用情况,其输出信息分为两部分,前半部分为系统统计信息,后半部分是进程信息. 第一行是任务队列信息,它的结果等同于upti ...