黑马程序员--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类中的私有属性和setter、getter通过JavaBean命名规范联系到了一起。
e.g 假设某个类有个属性 private int abc; 那么javaBean中对应这个属性就一定有setter和getter分别叫 setAbc( )和 getAbc( )
(2). 讨论反射操作JavaBean的可行性
[1]. 由于JavaBean私有字段和普通类的字段都可以进行读、写,所以通过反射技术就可以获取到这个字段并加以操作
[2]. 关联私有属性的public权限的setter和getter也可以通过反射技术被获取并进行调用。
{1}. 私有属性对应的setter的主要作用就是有条件地设置相应属性的值
{2}. 私有属性对应的getter的主要作用就是返回或者获取相应属性的值
【结论】通过反射设置或者获取JavaBean私有属性 <====>用反射调用JavaBean私有属性对应的public setter和getter
【注意】普通类的私有字段未必有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的公有setter和getter,比较合理
3). 简单内省操作 VS 反射操作
{1}. 简单内省操作JavaBean实际上是对使用反射+ Method调用公共的Setter和Getter的一个简单的封装。
{2}. 封装的对应关系如图:
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
- 黑马程序员--Java基础加强--10.【PropertyDescriptor操作JavaBean VS 反射操作Java类】【个人总结】
- 【黑马程序员】java基础加强------------------javabean与内省操作
- 黑马程序员--Java基础加强--07.【反射创建对象 操作字段 调用方法的异同】【个人总结】
- 黑马程序员--Java基础加强--12.利用反射操作泛型I【与反射+泛型相关的接口类型综述】【Type】【ParameterizedType】【个人总结】
- 黑马程序员--Java基础加强--13.利用反射操作泛型II【TypeVariable】【GenericArrayType】【WildcardType】【Type及其子接口的来历】【个人总结】
- 黑马程序员—Java基础加强(JavaBean)
- 黑马程序员--Java基础加强--16.利用反射操作泛型V【通过Constructor反射解析泛型构造方法】【通过Field反射解析泛型成员变量】【个人总结】
- Java 基础加强 - JavaBean与内省操作
- 黑马程序员---Java基础加强反射小结
- 黑马程序员-Java基础加强-反射
- 黑马程序员-JAVA基础加强-反射1
- 黑马程序员-JAVA基础加强-反射2
- 黑马程序员--java基础加强-反射
- 黑马程序员-JAVA基础加强之反射
- 黑马程序员 Java基础加强 反射
- 黑马程序员—Java基础加强(反射)
- 黑马程序员-Java基础加强之反射
- 黑马程序员---java基础加强---反射
- Oracle 只读表空间 说明
- eclipse 阅读代码高效快捷键
- 银联+移动+三星PK微信、余额宝
- 在对xml进行操作完成之后一定要记得保存,否则等于没操作
- 沙盒解决方案与场解决方案之间的差异
- 黑马程序员--Java基础加强--10.【PropertyDescriptor操作JavaBean VS 反射操作Java类】【个人总结】
- 保护眼睛,设置Visual Studio(eclipse)文本编辑背景色为自然绿
- PAT_1052: Linked List Sorting
- 【设计模式】学习笔记5:工厂模式(Factory Method)
- Eclipse去掉Ctrl校验设置方法
- 实现jsp页面自动跳转
- Jenkins的安全控制
- iOS7免费设计资源汇总
- URAL 1628 White Streaks(数据结构)