----------------------android培训、java培训、期待与您交流!
----------------------------------------
------------
内省和反射是等同的,只不过那些强调动态改变,加载的反射我们可以称之为内省
比如动态 的创建类我们可以称为是内省.比如从properties文件赋值
内省(IntroSpector):jdk 中提供了对 JavaBean 进行操作的一些 API ,这套 API 就称为内省。用内省这套 API 来操作 JavaBean 比用普通类的方式更方便。
内省是 Java 语言对 Bean 类属性、事件的一种处理方法(也就是说给定一个javabean对象,我们就可以得到/调用它的所有的get/set方法)
JavaBean: 是一个特殊(比一般类多了自己的特性)的 Java 类,它的方法要有get()、set() 方法。一个 JavaBean 类可以当做普通的类来使用,但是一个普通的类并不一定可以当作 JavaBean 来操作。因为它不一定符合 JavaBean 的规则。
功能:主要用于传递数据信息,这种 Java 类中的方法要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递多个信息,可以将这些信息缝扎un个到一个 JavaBean 中,这种 JavaBean 的实例对象通常称之为值对象(Value Object ,简称 VO)。这些信息在类中有私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。
用内省来操作 JavaBean ,先读取 JavaBean 的值,再设置 JavaBean 的属性值。
public class A {
public static void main(String[] args) throws Exception {
B b = new B();
PropertyDescriptor pd = new PropertyDescriptor("name", b.getClass()); //搜索到b及b的成员name;
Method m1 = pd.getWriteMethod();// 获取操作b成员的方法
m1.invoke(b, "郭"); //操作
Method m2 = pd.getReadMethod(); // 获取get()方法
Object obj = (String) m2.invoke(b);//m2通过.invoke()代理了b,可以操作b成分
System.out.println(obj);
}
}
class B {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
PS: Object invoke(Object obj, Object... args) obj-从中调用底层方法的对象 args-用于方法调用的参数
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
------
另一种方式:按照 BeanInfo 获取类
public class A {
public static void main(String[] args) throws Exception {
B b = new B();
BeanInfo beanInfo = Introspector.getBeanInfo(b.getClass()); // 从一个类的字节码中以 JavaBean 的方式读取类信息
PropertyDescriptor[] getPropertyDescriptors = beanInfo
.getPropertyDescriptors(); // 获取这个 JavaBean 对象中的所有属性
for (PropertyDescriptor propertyDescriptor : getPropertyDescriptors) {
if (propertyDescriptor.getName().equalsIgnoreCase("name")) { // 判断这个属性名是否是我们想要的
Method write = propertyDescriptor.getWriteMethod();
write.invoke(b, "郭");
Method read = propertyDescriptor.getReadMethod();
System.out.println(read.invoke(b, null));
}
}
}
}
PS:BeanInfo 接口:希望提供有关其 bean 的显式信息的 bean 实现者可以提供某个 BeanInfo 类,该类实现此 BeanInfo 接口并提供有关其 bean 的方法、属性、事件等显式信息。
Introspector 类:提供工具获得某个目标 Java Bean 支持的特性、事件和方法的一个标准方式。
----------------------android培训、java培训、期待与您交流!
----------------------详细请查看:http://edu.csdn.net/heima(日记必用代码)