java基础巩固系列(八):对javabean的内省操作
2014-08-26 11:35
465 查看
一、关于javabean
首先,大家需要明白什么是javabean。在以前我的想法中,只要是.java结尾的文件就是javabean,这种理解是错误的。
必须满足如下条件:
1、属性是私有的
2、提供标准的gettter()和setter()方法
3、必须有无参数的构造函数
二、关于javabean的内省操作
内省定义:通过反射的方式访问javabean中的属性。
用到的jdk中的类:PropertyDescriptor
1、对javabean的简单内省操作:
首先,我们先定义一个简单的javabean:
通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。
还是先创建一个javabean,同上:
首先,大家需要明白什么是javabean。在以前我的想法中,只要是.java结尾的文件就是javabean,这种理解是错误的。
必须满足如下条件:
1、属性是私有的
2、提供标准的gettter()和setter()方法
3、必须有无参数的构造函数
二、关于javabean的内省操作
内省定义:通过反射的方式访问javabean中的属性。
用到的jdk中的类:PropertyDescriptor
1、对javabean的简单内省操作:
首先,我们先定义一个简单的javabean:
package com.reflect; public class ReflectPoint { private int x; private int y; public ReflectPoint(int x, int y) { super(); this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }接下来,我们需要编写一个test测试
package com.reflect; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class IntroSpectorTest{ public static void main(String[] args) throws Exception { ReflectPoint pt1 = new ReflectPoint(3,5); String propertyName = "x"; //定义javabean中的属性名 Object retVal = getProperty(pt1, propertyName); System.out.println(retVal); //3 Object value = 7; setProperties(pt1, propertyName, value); System.out.println(pt1.getX());//7 } private static void setProperties(Object pt1, String propertyName, Object value) throws IntrospectionException, IllegalAccessException, InvocationTargetException { //创建属性描述器 PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass()); //获得写方法 Method methodSetX = pd.getWriteMethod(); methodSetX.invoke(pt1, value); } private static Object getProperty(Object pt1, String propertyName) throws IntrospectionException, IllegalAccessException, InvocationTargetException { PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass()); Method methodGetX = pd.getReadMethod(); //得到了x属性的读方法 Object retVal = methodGetX.invoke(pt1); return retVal; } }2、对javabean的复杂内省操作:
通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。
还是先创建一个javabean,同上:
package com.reflect; public class ReflectPoint { private int x; private int y; public ReflectPoint(int x, int y) { super(); this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }然后,编写一个test测试类:
package com.reflect; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class IntroSpectorTest{ public static void main(String[] args) throws Exception { ReflectPoint pt1 = new ReflectPoint(3,5); String propertyName = "x"; //定义javabean中的属性名 Object retVal = getProperty(pt1, propertyName); System.out.println(retVal); Object value = 7; setProperties(pt1, propertyName, value); System.out.println(pt1.getX()); } private static void setProperties(Object pt1, String propertyName, Object value) throws IntrospectionException, IllegalAccessException, InvocationTargetException { BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass()); PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); for(PropertyDescriptor pd : pds){ if(pd.getName().equals(propertyName)){ Method methodSetX = pd.getWriteMethod(); methodSetX.invoke(pt1, value); break; } } } private static Object getProperty(Object pt1, String propertyName) throws IntrospectionException, IllegalAccessException, InvocationTargetException { BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass()); PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); Object retVal = null; for(PropertyDescriptor pd : pds){ if(pd.getName().equals(propertyName)){ Method methodGetX = pd.getReadMethod(); retVal = methodGetX.invoke(pt1); break; } } return retVal; } }输出的结果和简单内省的相同、
相关文章推荐
- Java基础--对javaBean的简单内省操作
- 【黑马程序员】java基础加强------------------javabean与内省操作
- 黑马程序员—java基础学习--JavaBean的内省操作
- JAVA基础加强之对javaBean的内省简单操作
- java基础增强---JavaBean的内省操作
- Java 基础加强 - JavaBean与内省操作
- java基础加强03 内省和JavaBean
- java中的内省及javabean操作
- java基础加强--JavaBean和内省Introspector
- mongodb基础系列——java操作mongodb实现图片文件功能
- java基础巩固系列(一):override和overload之间的区别
- 学习笔记之javaweb基础:jsp基本语法,内置对象,对JavaBean的操作语法
- java mongodb 基础系列---查询,排序,limit,$in,$or,输出为list,创建索引,$ne 非操作
- 黑马程序员 java基础加强--内省与javaBean
- java基础加强--内省与javaBean
- java基础巩固系列(二):Integer与int之间的区别
- mongodb基础系列——java操作mongodb实现CURD
- Java基础复习:JavaBean和Java内省API
- 黑马程序员:Java基础总结----JavaBean 内省
- 黑马程序员--Java基础加强--10.【PropertyDescriptor操作JavaBean VS 反射操作Java类】【个人总结】