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的讲解的更多相关文章

  1. 由内省引出JavaBean的应用

    IntroSpector-->javaBean-->特殊的java类 get和set方法 ReflectPoint pt1 = new ReflectPoint(3,5); String ...

  2. 内省(introspector)------>JavaBean

    内省(introspector)------>JavaBean    1.问什么要学内省?        开发框架时,经常需要Java对象的属性来来封装程序的数据,每次使用反射技术完成此操作过于 ...

  3. 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性

      本文转载自:http://blog.sina.com.cn/s/blog_5d65a16901011kom.html 关键字:内省.JavaBean.PropertyDescriptor类.Int ...

  4. 内省操作javabean的属性

    import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector ...

  5. 内省与JavaBean

    概述 JavaBean代表一类特殊的Java类,这种类主要用来存储和传递属性信息,JavaBean中的方法主要用于设置和获取这些私有属性,他们有一定的命名规则,我们可以把它们想象为一个侧重属性信息的类 ...

  6. java 内省 了解JavaBean

    JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则. 如果要在两个模块之间传递多个信息,可以将这些信息封装到一个Jav ...

  7. 黑马程序员_高新技术之javaBean,注解,类加载器

    ----------- android培训.java培训.java学习型技术博客.期待与您交流! ---------- 第一部分 javaBean 一,由内省引出javaBean 1,内省: 内省对应 ...

  8. 使用内省的方式操作JavaBean

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

  9. java 深入技术八(内省)

    1. javabean的软件设计思想 2.内省:封装了java反射,提供直接操作属性的Setter和getter方法的方法 3.核心API:BeanInfo java 的描述信息,Introspect ...

随机推荐

  1. postgresql 获取修改列的值

    使用returning CREATE TABLE users (firstname text, lastname text, id serial primary key); INSERT INTO u ...

  2. Python和Java分别实现冒泡排序

    1.基本思想 冒泡排序的基本思想是对比相邻的元素值.相邻元素值比较,如果满足条件两者就交换,把较小的移动到前面,把较大的移动到后面,这样较小的元素就像气泡一样浮上来了.可以看出,冒泡排序的每一次循环都 ...

  3. 绕过边界防火墙之ICMP隧道、HTTP隧道、UDP隧道

    一.ICMP隧道 背景:已经通过某种手段拿到了园区网A主机的控制权,但是边界防火墙只放行该主机向外的ICMP流量,此时怎样才能让A主机和公网主机C建立TCP连接呢? 方案:将TCP包内容包裹在ICMP ...

  4. IdentityServer4 中文文档 -6- (简介)示例服务器和测试

    IdentityServer4 中文文档 -6- (简介)示例服务器和测试 原文:http://docs.identityserver.io/en/release/intro/test.html 目 ...

  5. webpack 学习总结demo

    github源码地址 https://github.com/ghshuo/webpack-demo webpack介绍 webpack 是一个现代 JavaScript 应用程序的静态模块打包器(mo ...

  6. WPF 使用RPC调用其他进程

    如果在 WPF 需要用多进程通信,一个推荐的方法是 WCF ,因为 WCF 是 RPC 计算.先来讲下 RPC (Remote Procedure Call) 远程过程调用,他是通过特定协议,包括 t ...

  7. 转STM32官方固件库简介

    ST(意法半导体)为了方便用户开发程序,提供了一套丰富的 STM32 固件库.固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API) .固件库将这些寄 ...

  8. 设计模式之责任链模式(Chain of Responsibility )

    责任链的目的是通过特定的设计对请求者和接收者之间进行解耦,请求者调用操作的对象,接收者接收请求并执行相关操作,通过解耦请求者不需要关心接收者的接口,同时也可增强职责的灵活性,通过改变链内的成员或调用次 ...

  9. windows下navicate for mysql 零填充不显示

    在mysql数据库中我们在需要某个字段时经常要用到零填充 zerofill,之前碰到了一个大坑,在数据表sql语句中明明规定了 unsigned zerofill:但是一直没有显示出来,以为自己写的s ...

  10. vue点击元素变色兄弟元素不变色

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...