Java 内省(Introspector)深入理解攻略
什么是Java内省(Introspector)
Java内省是指可以在运行时检查一个JavaBean的属性、方法和事件
利用JavaBean的内省机制,我们可以在访问一个对象的属性时调用一些预定义的方法,从而更方便的操作对象。
Java提供了一个Introspector类,通过该类我们可以取得某个JavaBean的类属性、方法及事件等。
Java 内省深入理解
首先,需要了解一下JavaBean的概念:JavaBean是指包含了私有变量和公开方法(getter/setter方法)的类。Bean命名符合以下规则:
* 所有的属性都是private
* 属性中每个变量都有getter/setter方法,且方法名称符合规范(getXxx()/setXxx())
* Bean有一个无参数的构造方法
注:方法名称中Xxx表示属性名称首字母大写。
Java内省机制将JavaBean的属性分为属性和方法两种,以属性为例讲解Java内省机制:
获取一个JavaBean的属性
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class IntrospectorExample {
public static void main(String args[]) {
MyBean myBean = new MyBean();
myBean.setName("John Doe");
myBean.setAge(30);
PropertyDescriptor[] descriptors = null;
Method readMethod = null;
Object propertyValue = null;
try {
// 获取MyBean的全部属性描述符
descriptors = Introspector.getBeanInfo(MyBean.class).getPropertyDescriptors();
} catch (Exception e) {
System.err.println("Caught Exception: " + e.getMessage());
}
if (descriptors != null) {
// 遍历所有属性描述符
for (PropertyDescriptor descriptor : descriptors) {
System.out.println(descriptor.getName());
// 显示get相关方法
readMethod = descriptor.getReadMethod();
System.out.println("Read Method: " + readMethod);
// 获取属性值
try {
propertyValue = readMethod.invoke(myBean);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
System.err.println("Caught Exception: " + e.getMessage());
}
System.out.println("Property Value: " + propertyValue);
}
}
}
}
class MyBean {
private String name;
private int age;
public MyBean() {
this.name = "";
this.age = 0;
}
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;
}
}
以上代码描述了如何获取一个JavaBean的全部属性和属性值,并通过反射获取属性的get方法,从而获取属性值。
修改一个JavaBean的属性
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class IntrospectorExample {
public static void main(String args[]) {
MyBean myBean = new MyBean();
myBean.setName("John Doe");
myBean.setAge(30);
PropertyDescriptor[] descriptors = null;
Method writeMethod = null;
Object propertyValue = null;
try {
// 获取MyBean的全部属性描述符
descriptors = Introspector.getBeanInfo(MyBean.class).getPropertyDescriptors();
} catch (Exception e) {
System.err.println("Caught Exception: " + e.getMessage());
}
if (descriptors != null) {
// 遍历所有属性描述符
for (PropertyDescriptor descriptor : descriptors) {
if (descriptor.getName().equals("name")) {
// 显示set相关方法
writeMethod = descriptor.getWriteMethod();
System.out.println("Write Method: " + writeMethod);
// 修改属性值
try {
writeMethod.invoke(myBean, "Jane Doe");
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
System.err.println("Caught Exception: " + e.getMessage());
}
break;
}
}
}
System.out.println("Name: " + myBean.getName());
}
}
class MyBean {
private String name;
private int age;
public MyBean() {
this.name = "";
this.age = 0;
}
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;
}
}
以上代码展示了修改一个JavaBean的指定属性的方法,通过获取属性的set方法,调用set方法修改属性值。
示例说明
以上代码均为示例代码,MyBean为示例的JavaBean类,其中定义了name和age属性,读者可根据需要修改类中的属性定义。在获取一个JavaBean的属性中,展示了如何获取一个JavaBean的全部属性和属性值;在修改一个JavaBean的属性中,展示了如何修改一个JavaBean的指定属性。
注:本示例仅为演示Java内省机制,实际应用中JavaBean的属性往往更为复杂。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 内省(Introspector)深入理解 - Python技术站