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学习型技术博客、期待与您交流! ------------