java的反射技术,提供给了开发人员操作成员变量、成员方法和构造函数等等方法。很多时候,常常要用对象的属性来封装数据,反射技术完成这类操作过于繁琐,于是就有了内省的出现,它的作用,就是用来操作对象的属性的,大大减轻代码量。
内省就是操作javaBean的。下面来看一个User类的JavaBean
package Day01;
public class User {
private String name;//字段,当有了get或者set方法之后就成为该类的属性,查看一个类的属性也就是看有几个get或者set方法。
private String pass;
private int age;
//该类共有5个属性,这里隐含了一个继承自父类Object中的getClass()。
public String getAb(){
return "这也是一个属性";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
IntrospectorTest类来操作User中的属性。
package Day01;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class IntrospectorTest {
public static void main(String[] args) throws Exception {
test1(); //内省的基本操作
test2(); // 直接获取某个属性的属性描述器
}
// 内省的基本操作
private static void test1() throws Exception {
// 获取Bean信息的封装对象
BeanInfo info = Introspector.getBeanInfo(User.class);
// 下面的这个info不会拿到其继承下来的属性,这里即指Object中的class属性。
// BeanInfo info = Introspector.getBeanInfo(Person.class,Object.class);
// 得到所有的属性描述器
PropertyDescriptor[] pds = info.getPropertyDescriptors();
for (PropertyDescriptor p : pds) {
// 通过属性描述器得到属性名
System.out.println(p.getName());
// 通过属性描述器得到属性类型
System.out.println(p.getPropertyType());
}
}
// 直接获取某个属性的属性描述器
private static void test2() throws Exception {
// 直接获取Person的name属性的属性描述器private String name;
PropertyDescriptor pd = new PropertyDescriptor("name", User.class);//第一个参数是属性名,第二个参数是BeanClass
// 由属性获得其setName()方法
Method write = pd.getWriteMethod();
User user = new User();
// 用invoke执行方法
write.invoke(user, "张三");//给user的name属性设置,相当于setName(String name)方法。
// 获得getName()方法
Method read = pd.getReadMethod();
String name = (String) read.invoke(user, null);//相当于getName()方法。
System.out.println(name);
}
}