java

位置:IT落伍者 >> java >> 浏览文章

java内省机制


发布日期:2019年10月08日
 
java内省机制

内省是 Java 语言对 Bean 类属性事件的一种处理方法(也就是说给定一个javabean对象我们就可以得到/调用它的所有的get/set方法)

例如类 A 中有属性 name 那我们可以通过 getNamesetName 来得到其值或者设置新的值通过 getName/setName 来访问 name 属性这就是默认的规则

Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法通过这些 API 可以使你不需要了解这个规则这些 API 存放于包 javabeans 中

一般的做法是通过类 Introspector 的 getBeanInfo方法 来获取某个对象的 BeanInfo 信息然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor)通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法然后我们就可以通过反射机制来调用这些方法

内省测试类:Introspectorjava

Java代码

package comroyzhoubean;

import javabeansBeanInfo; import javabeansIntrospector; import javabeansMethodDescriptor; import javabeansPropertyDescriptor;

public class IntrospectorTest {

public static void main(String[] args) throws Exception {

SimpleBean sb = new SimpleBean(royzhounew String[]{footballbacketball});

Systemoutprintln(sb);

/**

* 使用IntrospectorgetBeanInfo(SimpleBeanclass)将Bean的属性放入到BeanInfo中

* 第二个参数为截止参数表示截止到此类之前不包括此类

* 如果不设置的话那么将会得到本类以及其所有父类的info

* BeanInfo中包含了SimpleBean的信息

*/

BeanInfo beanInfo = IntrospectorgetBeanInfo(sbgetClass());

//将每个属性的信息封装到一个PropertyDescriptor形成一个数组其中包括属性名字读写方法属性的类型等等PropertyDescriptor[] propertys = beanInfogetPropertyDescriptors();

for(PropertyDescriptor property : propertys) {

Systemoutprintln(属性名: + propertygetName()); Systemoutprintln(类型: + propertygetPropertyType());

}

Systemoutprintln();

Systemoutprintln(列出SimpleBean的所有方法); MethodDescriptor[] methods = beanInfogetMethodDescriptors();

for(MethodDescriptor method : methods) {

Systemoutprintln(methodgetName());

}

Systemoutprintln();

/**

*重新设置属性值

*/

for(PropertyDescriptor property : propertys) {

if(propertygetPropertyType()isArray()){ //getPropertyType得到属性类型

if(propertygetPropertyType()isArray()) { if(hobbyequals(propertygetName())) {

//getComponentType()可以得到数组类型的元素类型

if(propertygetPropertyType()getComponentType()equals(Stringclass)) {

//getWriteMethod()得到此属性的set方法Method对象然后用invoke调用这个方法

propertygetWriteMethod()invoke(sb new Object[]{new String[]{tennisfishing}});

}

}

}

} else if(nameequals(propertygetName())) { propertygetWriteMethod()invoke(sb new Object[] { royzhou });

}

}

/**

*获取对象的属性值

*/

Systemoutprintln(获取对象的属性值);

for(PropertyDescriptor property : propertys) {

if(propertygetPropertyType()isArray()){ //getPropertyType得到属性类型

//getReadMethod()得到此属性的get方法Method对象然后用invoke调用这个方法String[] result=(String[]) propertygetReadMethod()invoke(sb new Object[]{}); Systemoutprint(propertygetName()+:);//getName得到属性名字for (int j = ; j < resultlength; j++) { Systemoutprint(result[j] + );

}

Systemoutprintln();

}

else{

Systemoutprintln(propertygetName()+:+propertygetReadMethod()invoke(sb new Object[]{}));

}

}

}

}

package comroyzhoubean;

import javabeansBeanInfo; import javabeansIntrospector; import javabeansMethodDescriptor; import javabeansPropertyDescriptor;

public class IntrospectorTest {

public static void main(String[] args) throws Exception {

SimpleBean sb = new SimpleBean(royzhounew String[]{footballbacketball});

Systemoutprintln(sb);

/**

* 使用IntrospectorgetBeanInfo(SimpleBeanclass)将Bean的属性放入到BeanInfo中

* 第二个参数为截止参数表示截止到此类之前不包括此类

* 如果不设置的话那么将会得到本类以及其所有父类的info

* BeanInfo中包含了SimpleBean的信息

*/

BeanInfo beanInfo = IntrospectorgetBeanInfo(sbgetClass());

//将每个属性的信息封装到一个PropertyDescriptor形成一个数组其中包括属性名字读写方法属性的类型等等PropertyDescriptor[] propertys = beanInfogetPropertyDescriptors();

for(PropertyDescriptor property : propertys) {

Systemoutprintln(属性名: + propertygetName()); Systemoutprintln(类型: + propertygetPropertyType());

}

Systemoutprintln();

Systemoutprintln(列出SimpleBean的所有方法); MethodDescriptor[] methods = beanInfogetMethodDescriptors();

for(MethodDescriptor method : methods) {

Systemoutprintln(methodgetName());

}

Systemoutprintln();

/**

*重新设置属性值

*/

for(PropertyDescriptor property : propertys) {

if(propertygetPropertyType()isArray()){ //getPropertyType得到属性类型

if(propertygetPropertyType()isArray()) { if(hobbyequals(propertygetName())) {

//getComponentType()可以得到数组类型的元素类型

if(propertygetPropertyType()getComponentType()equals(Stringclass)) { //getWriteMethod()得到此属性的set方法Method对象然后用invoke调用这个方法propertygetWriteMethod()invoke(sb new Object[]{new String[]{tennisfishing}});

}

}

}

} else if(nameequals(propertygetName())) { propertygetWriteMethod()invoke(sb new Object[] { royzhou });

}

}

/**

*获取对象的属性值

*/

Systemoutprintln(获取对象的属性值);

for(PropertyDescriptor property : propertys) {

if(propertygetPropertyType()isArray()){ //getPropertyType得到属性类型

//getReadMethod()得到此属性的get方法Method对象然后用invoke调用这个方法String[] result=(String[]) propertygetReadMethod()invoke(sb new Object[]{}); Systemoutprint(propertygetName()+:);//getName得到属性名字for (int j = ; j < resultlength; j++) { Systemoutprint(result[j] + );

}

Systemoutprintln();

}

else{

Systemoutprintln(propertygetName()+:+propertygetReadMethod()invoke(sb new Object[]{}));

}

}

}

}

输出结果:

comroyzhoubeanSimpleBean@aef

name:=royzhou

hobby:footballbacketball

属性名:class

类型:class javalangClass

属性名:hobby

类型:class [LjavalangString;

属性名:name

类型:class javalangString

列出SimpleBean的所有方法

hashCode

setHobby

equals

wait

wait

notify

getClass

toString

notifyAll

getHobby

setName

wait

getName

获取对象的属性值

class:class comroyzhoubeanSimpleBean hobby:tennisfishing

name:royzhou

               

上一篇:用freemarker标签实现一行五列的表格算法

下一篇:Java:逆转字符串