内省(Introspector)是Java 语言对Bean类属性、事件的一种缺省处理方法。
例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。
Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则,这些 API 存放于包 java.beans 中。
内省和反射区别:
反射式在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态。
内省机制是通过反射来实现的,BeanInfo用来暴露一个bean的属性、方法和事件,以后我们就可以操纵该JavaBean的属性。
javabean
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
测试方法:
public static void main(String[] args) throws IntrospectionException {
//获取指定字节码的属性信息(获取User类,不获取Object类)
BeanInfo beanInfo = Introspector.getBeanInfo(User.class, Object.class);
System.out.println("=================属性描述==================");
//获取所有属性描述器
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : propertyDescriptors) {
//获取属性名称
System.out.println(pd.getName());
//get方法,pd.getReadMethod()返回值是Method
//所以获取Method后就可以使用反射做相关事情
System.out.println(pd.getReadMethod());
//set方法
System.out.println(pd.getWriteMethod());
}
System.out.println("=================类描述==================");
BeanDescriptor beanDescriptor = beanInfo.getBeanDescriptor();
System.out.println(beanDescriptor);
System.out.println("=================方法描述==================");
MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
for (MethodDescriptor md : methodDescriptors) {
System.out.println(md);
}
}
内省使用场景:根据属性名称得出该属性的读写方法。内省一般写业务代码的时候是用不到的,大部分是在写一些框架或者工具的时候会用到。
原文:https://www.cnblogs.com/wwjj4811/p/14682889.html