Java:内省(Introspector)

Java:内省(Introspector)

什么是内省

维基百科

在电脑科学中,内省是指电脑程序在运行时(Runtime)检查对象(Object)类型的一种能力,通常也可以称作“运行时类型检查"。一些编程语言如C++、Java、Ruby、PHP、Objective-C、Perl等等具有这种特性。
不应该将内省和反射混淆。相对于内省,反射更进一步,是指电脑程序在运行时(Runtime)可以访问、检测和修改它本身状态或行为的一种能力。一些编程语言比如Java具有反射特性,而C++不具有反射特性只具有内省特性。
file

自己的理解

内省是对反射的进一步封装,或者说是反射的高级API
同时限制也会更多

案例

/**
 * 传统方式
 */
user = new User();
user.setUserId(19);
user.setUserName("传统");
System.out.println(user);

/**
 * 使用反射的方式来写入javabean
 * 如果不用反射,那么传统的方式是不可能实现通用的。
 */
user = new User();
Field field = User.class.getDeclaredField("userName");
field.setAccessible(true);
field.set(user,"反射");
System.out.println(user);

/**
 * 使用内省的方式来访问javabean
 */
user = new User();
// 创建属性描述器,用于调用get和set方法
PropertyDescriptor descriptor = new PropertyDescriptor("userName", User.class);
// 获得写方法
Method writeMethod = descriptor.getWriteMethod();
// 调用写方法
writeMethod.invoke(user, "内省");
System.out.println(user);

参考文章

javabean以及内省技术详解
JDK 之 Java Bean 内省机制
英文文章:https://www.oreilly.com/library/view/developing-java-beans/1565922891/ch01s03.html