------- android培训、java培训、期待与您交流! ---------
内省(IntroSpector) 主要对JavaBean进行操作。
JavaBean:
特殊的java类。JavaBean的属性是根据其中的get和set来确定的,
gettime-->time
setTime-->time
getCPU-->CPU
如果一个类符合JavaBean的特点,可以当做普通类处理,也可以当做JavaBean处理。
如果在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中。这种JavaBean
的实例对象通常称为值对象。
对JavaBean的简单内省操作
通过内省的方式对Person对象中的成员变量进行读写操作。
并对生成的代码进行重构。
通过反射对某个属性进行读写操作的代码可以抽取为通用方法,通过MyEclipse可以非常轻松实现这个功能。
步骤如下:选中需要重构的代码,右击-->Refactor-->Extract Method...。
给抽取后的方法取一个名字,然后点击OK。
JavaBean:
书写格式为:
1.必须有无参构造函数
2.属性必须私有, 我们称为字段
3.提供标准的getter和setter
public class ReflectPoint {
/**
* @param args
*/
//无参构造方法
ReflectPoint(){
}
//get\set方法
private int x;
private int 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;
}
public String str1 = "ball";
public String str2 = "basketball";
public String str3 = "itheima";
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ReflectPoint other = (ReflectPoint) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return str1 + ":" + str2 + ":" + str3;
}
}
内省:
ReflectPoint pt1 = new ReflectPoint(3, 5);
String propertyName = "x";
//反射方法获取x :"x"-->"X"-->"getX"-->Method GetX-->
//内省方式 PropertyDescriptor(属性名, 类)
PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());//属性描述符
//获取x的读方法。
Method methodGetX = pd.getReadMethod();
//调用get方法
Object retVal1 = methodGetX.invoke(pt1);
//获取x的读方法。
Method methodSetX = pd.getWriteMethod();
//调用Set方法
methodGetX.invoke(pt1,7);
System.out.println(pt1.getX());//7
复杂的内省:
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
//得到bean中的所有属性
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;
}
}
1.下载工具包。
2.工程下创建lib文件夹,把工具包放入文件夹,右击工程,buildPath,add to buildPath。
BeanUtiles内省操作:
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
ReflectPoint pt1 = new ReflectPoint(3,5);
String propertyName = "x";
//"x"-->"X"-->"getX"-->MethodGetX-->
//得到getProperty
Object retVal = getProperty(pt1, propertyName);
System.out.println(retVal);
Object value = 7;
//设置getProperty
setProperties(pt1, propertyName, value);
System.out.println(BeanUtils.getProperty(pt1, "x").getClass().getName());
BeanUtils.setProperty(pt1, "x", "9");
System.out.println(pt1.getX());
/*
//java7的新特性
Map map = {name:"zxx",age:18};
BeanUtils.setProperty(map, "name", "lhm");
*/
BeanUtils.setProperty(pt1, "birthday.time", "111");
System.out.println(BeanUtils.getProperty(pt1, "birthday.time"));
PropertyUtils.setProperty(pt1, "x", 9);
System.out.println(PropertyUtils.getProperty(pt1, "x").getClass().getName());
}
PropertyUtils:
PropertyUtils.setProperty(pt1, "x", 9);
System.out.println(PropertyUtils.getProperty(pt1, "x").getClass().getName());