黑马程序员-内省学习笔记

      内省(Introspector) :是Java 语言对JavaBean类属性、事件的一种缺省处理方法。JavaBean:是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。这些信息储存在类的私有变量中,通过setXxx()方法设置值、getXxx()方法获取值。

Java代码   收藏代码
  1. package it.shuangxi.instrospector;  
  2. /** 
  3.  * 一个JavaBean 
  4.  */  
  5. public class StudentInfo {  
  6.     private long userId;  
  7.     private String userName;  
  8.     private int age;  
  9.     private String emailAddress;  
  10.   
  11.     public long getUserId() {  
  12.         return userId;  
  13.     }  
  14.   
  15.     public void setUserId(long userId) {  
  16.         this.userId = userId;  
  17.     }  
  18.   
  19.     public String getUserName() {  
  20.         return userName;  
  21.     }  
  22.   
  23.     public void setUserName(String userName) {  
  24.         this.userName = userName;  
  25.     }  
  26.   
  27.     public int getAge() {  
  28.         return age;  
  29.     }  
  30.   
  31.     public void setAge(int age) {  
  32.         this.age = age;  
  33.     }  
  34.   
  35.     public String getEmailAddress() {  
  36.         return emailAddress;  
  37.     }  
  38.   
  39.     public void setEmailAddress(String emailAddress) {  
  40.         this.emailAddress = emailAddress;  
  41.     }  
  42. }  


在上面的类(StudentInfo)中有属性userName,并提供了getUserName(), setUserName()方法,我们可以通过getUserName/setUserName来访问userName属性,这就是默认的规则。Java JDK中提供了一套API用来访问某个属性的getter/setter方法,这就是内省。


--------------------------------------PropertyDescriptor类--------------------------------------

PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法:

1. getPropertyType(),获得属性的Class对象;

2. getReadMethod(),获得用于读取属性值的方法;

3. getWriteMethod(),获得用于写入属性值的方法;

4. hashCode(),获取对象的哈希值;

5. setReadMethod(Method readMethod),设置用于读取属性值的方法;

6. setWriteMethod(Method writeMethod),设置用于写入属性值的方法。


--------------------------------------Introspector类--------------------------------------

       将JavaBean中的属性封装起来进行操作。在程序把一个类当做JavaBean,调用Introspector.getBeanInfo()方法,就得到的BeanInfo对象封装了,把这个类当做JavaBean的属性的信息。getPropertyDescriptors(),获得属性的描述,可以采用遍历BeanInfo的方法,来查找、设置类的属性。

利用反射方法,通过属性名设定或获取对应的值:

 影音先锋电影 http://www.iskdy.com/

Java代码   收藏代码
  1. package it.shuangxi.instrospector;  
  2.   
  3. import java.beans.BeanInfo;  
  4. import java.beans.Introspector;  
  5. import java.beans.PropertyDescriptor;  
  6. import java.lang.reflect.Method;  
  7.   
  8. public class BeanInfoUtil {  
  9.       
  10.     /************************PropertyDescriptor类*********************************/  
  11.     // 设置bean的某个属性值  
  12.     public static void setProperty(StudentInfo userInfo, String userName)throws Exception {  
  13.         // 获取bean的某个属性的描述符  
  14.         PropertyDescriptor propDesc = new PropertyDescriptor(userName,StudentInfo.class);  
  15.         // 获得用于写入属性值的方法  
  16.         Method methodSetUserName = propDesc.getWriteMethod();  
  17.         // 写入属性值  
  18.         methodSetUserName.invoke(userInfo, "setProperty");  
  19.         System.out.println("setProperty set userName:" + userInfo.getUserName());  
  20.     }  
  21.   
  22.     // 获取bean的某个属性值  
  23.     public static void getProperty(StudentInfo userInfo, String userName)throws Exception {  
  24.         // 获取Bean的某个属性的描述符  
  25.         PropertyDescriptor proDescriptor = new PropertyDescriptor(userName,StudentInfo.class);  
  26.         // 获得用于读取属性值的方法  
  27.         Method methodGetUserName = proDescriptor.getReadMethod();  
  28.         // 读取属性值  
  29.         Object objUserName = methodGetUserName.invoke(userInfo);  
  30.         System.out.println("setProperty get userName:" + objUserName.toString());  
  31.     }  
  32.   
  33.     /************************Introspector类*********************************/  
  34.     // 通过内省设置bean的某个属性值  
  35.     public static void setPropertyByIntrospector(StudentInfo userInfo,  String userName) throws Exception {  
  36.         // 获取bean信息  
  37.         BeanInfo beanInfo = Introspector.getBeanInfo(StudentInfo.class);  
  38.         // 获取bean的所有属性列表  
  39.         PropertyDescriptor[] proDescrtptors = beanInfo.getPropertyDescriptors();  
  40.         // 遍历属性列表,查找指定的属性  
  41.         if (proDescrtptors != null && proDescrtptors.length > 0) {  
  42.             for (PropertyDescriptor propDesc : proDescrtptors) {  
  43.                 // 找到则写入属性值  
  44.                 if (propDesc.getName().equals(userName)) {  
  45.                     //获取该属性的写方法  
  46.                     Method methodSetUserName = propDesc.getWriteMethod();  
  47.                     // 写入属性值  
  48.                     methodSetUserName.invoke(userInfo, "setPropertyByIntrospector");   
  49.                     System.out.println("setPropertyByIntrospector set userName:" + userInfo.getUserName());  
  50.                     //写完后就不用在往下循环了  
  51.                     break;  
  52.                 }  
  53.             }  
  54.         }  
  55.     }  
  56.   
  57.     // 通过内省获取bean的某个属性值  
  58.     public static void getPropertyByIntrospector(StudentInfo userInfo,String userName) throws Exception {  
  59.         // 获取bean信息  
  60.         BeanInfo beanInfo = Introspector.getBeanInfo(StudentInfo.class);  
  61.         // 获取bean的所有属性列表  
  62.         PropertyDescriptor[] proDescrtptors = beanInfo.getPropertyDescriptors();  
  63.         if (proDescrtptors != null && proDescrtptors.length > 0) {  
  64.             //遍历属性,找到要读取到字段  
  65.             for (PropertyDescriptor propDesc : proDescrtptors) {  
  66.                 //找到字段就读取  
  67.                 if (propDesc.getName().equals(userName)) {  
  68.                     //通过反射获取读方法  
  69.                     Method methodGetUserName = propDesc.getReadMethod();  
  70.                     //用反射调用方法,并接受返回值  
  71.                     Object objUserName = methodGetUserName.invoke(userInfo);  
  72.                     //打印出该属性值  
  73.                     System.out.println("setPropertyByIntrospector get userName:" + objUserName.toString());  
  74.                     //结束循环  
  75.                     break;  
  76.                 }  
  77.             }  
  78.         }  
  79.     }  
  80. }  
测试代码代码   收藏代码
  1. package it.shuangxi.instrospector;  
  2.   
  3. public class BeanInfoTest {  
  4.   
  5.     /**  
  6.      * 测试类  
  7.      */  
  8.     public static void main(String[] args) {  
  9.         //实例话一个用户类  
  10.         StudentInfo userInfo = new StudentInfo();  
  11.         //为用户类设置姓名  
  12.         userInfo.setUserName("userInfo.setUserName");  
  13.         try {  
  14.             //获取userInfo的userName的值  
  15.             BeanInfoUtil.getProperty(userInfo, "userName");  
  16.             //设置userInfo的userName的值  
  17.             BeanInfoUtil.setProperty(userInfo, "userName");  
  18.             //获取userInfo的userName的值  
  19.             BeanInfoUtil.getProperty(userInfo, "userName");  
  20.             //设置userInfo的userName的值  
  21.             BeanInfoUtil.setPropertyByIntrospector(userInfo, "userName");  
  22.             //获取userInfo的userName的值  
  23.             BeanInfoUtil.getPropertyByIntrospector(userInfo, "userName");  
  24.             //获取userInfo的age的值  
  25.         //  BeanInfoUtil.setProperty(userInfo, "age"); // IllegalArgumentException  
  26.         } catch (Exception e) {  
  27.             e.printStackTrace();  
  28.         }  
  29.     }  
  30. }  

结果:

Java代码   收藏代码
  1. setProperty get userName:userInfo.setUserName  
  2. setProperty set userName:setProperty  
  3. setProperty get userName:setProperty  
  4. setPropertyByIntrospector set userName:setPropertyByIntrospector  
  5. setPropertyByIntrospector get userName:setPropertyByIntrospector  

通过这两个类的使用比较可以看出,都是需要获得PropertyDescriptor,方式有所不同:前者通过创建对象直接获得,后者需要遍历,所以使用PropertyDescriptor类更加方便。

说明:上面代码中,BeanInfoUtil.setProperty(userInfo,"age");抛异常,报错是应为age属性是int数据类型,而setProperty方法里面默认给属性赋值是String类型。所以会爆出argument type mismatch参数类型不匹配的错误信息。


伦理片 http://www.dotdy.com/




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值