黑马程序员--Java基础加强--10.【PropertyDescriptor操作JavaBean VS 反射操作Java类】【个人总结】

来源:互联网 发布:js怎么给隐藏域赋值 编辑:程序博客网 时间:2024/05/21 08:04

JavaBean总结-----

      简单内省操作和反射操作的关系     

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

这篇日志着重阐述对JavaBean的简单内省操作和反射操作的关系

1.    简单内省操作JavaBean VS 反射操作JavaBean

1). JavaBean的特殊性

(1). JavaBean私有属性和对应的setter和getter方法

JavaBean中的私有属性settergetter通过JavaBean命名规范联系到了一起。

e.g 假设某个类有个属性  private int abc; 那么javaBean中对应这个属性就一定有setter和getter分别叫 setAbc( )和 getAbc( )

(2). 讨论反射操作JavaBean的可行性

[1]. 由于JavaBean私有字段普通类的字段都可以进行读、写,所以通过反射技术就可以获取到这个字段并加以操作

[2]. 关联私有属性public权限settergetter也可以通过反射技术被获取并进行调用。

{1}. 私有属性对应的setter主要作用就是有条件地设置相应属性的值

{2}. 私有属性对应的getter主要作用就是返回或者获取相应属性的值

【结论】通过反射设置或者获取JavaBean私有属性 <====>用反射调用JavaBean私有属性对应的public settergetter


【注意】普通类的私有字段未必有setter和getter,所以,未必存在相通的方法调用和直接读写字段等效。这也能看出JavaBean有自己的优势。

2). 通过反射操作JavaBean

【JavaBean类代码】

public class TestBean {    private String name;     public TestBean(String name) {       super();       this.name = name;    }     public String getName() {       return name;    }     public void setName(String name) {       this.name = name;    }}

(1). 采用反射获取和设置来操作JavaBean的私有属性

[1]. 反射获取属性值

【示例代码】

private static Object reflectFieldGet(Class clazz, Object javaBean,       StringpropertyName) throws NoSuchFieldException,       IllegalAccessException{    Fieldfield =clazz.getDeclaredField(propertyName);    field.setAccessible(true);    ObjectretVal =field.get(javaBean);    return retVal;}

[2]. 反射设置属性值

【示例代码】

private static void reflectFieldSet(Class clazz, ObjectjavaBean,       StringpropertyName) throws NoSuchFieldException,       IllegalAccessException{    //设置属性值 ----因为是私有属性    Fieldfield =clazz.getDeclaredField(propertyName);    field.setAccessible(true);    field.set(javaBean,"newBenjamin");}

[3]. 测试代码

Class clazz =Class.forName("com.beans.TestBean");          //实例化对象Constructor con =clazz.getConstructor(String.class);Object javaBean =con.newInstance("Benjamin");String propertyName ="name"; //通过反射获取指定对象的属性值Object retVal = reflectFieldGet(clazz,javaBean, propertyName);System.out.println("设置之前 name 属性的值:"+ retVal); //通过反射设置指定对象的属性值reflectFieldSet(clazz, javaBean,propertyName); retVal = reflectFieldGet(clazz, javaBean,propertyName);System.out.println("设置之后 name 属性的值:"+retVal);

打印结果:

设置之前 name 属性的值:Benjamin

设置之后 name 属性的值:newBenjamin

(2). 采用反射调用JavaBean私有属性的public setter和getter方法

[1]. 调用JavaBean public getter方法

【示例代码】

private static Object reflectMethodGet(Class clazz, Object javaBean,       StringmethodName) throws NoSuchMethodException,       IllegalAccessException,InvocationTargetException {    MethodmethodGet =clazz.getMethod(methodName, null);    ObjectretVal =methodGet.invoke(javaBean, null);    return retVal;}

[2]. 调用JavaBean public setter方法

【示例代码】

private static void reflectMethodSet(Class clazz,Object javaBean,       StringmethodName, Object setVal) throwsNoSuchMethodException,       IllegalAccessException,InvocationTargetException {    MethodmethodSet =clazz.getMethod(methodName, String.class);    methodSet.invoke(javaBean,setVal);}

[3]. 测试代码

String methodName ="getName";Object retVal = reflectMethodGet(clazz,javaBean, methodName);System.out.println("设置之前 name 属性的值:"+retVal); methodName ="setName";Object setVal ="newBenjamin";reflectMethodSet(clazz, javaBean, methodName,setVal); methodName ="getName";retVal = reflectMethodGet(clazz, javaBean,methodName);System.out.println("设置之后 name 属性的值:"+retVal);

打印结果同Field操作字段

 (3). 对比两种方法

{1}. 采用反射Field直接操作JavaBean的私有字段破坏了OOP的封装性不算好

{2}. 采用反射Method直接操作JavaBean的公有settergetter比较合理

3). 简单内省操作 VS 反射操作

{1}. 简单内省操作JavaBean实际上是对使用反射+ Method调用公共的SetterGetter一个简单的封装

{2}. 封装的对应关系如图:


----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

 

原创粉丝点击