分别使用Reflect和Introspector对属性进行操作

编程

通过反射获得属性列表,没有父类的属性!

我们先看看通过反射对属性进行操作:

先定义俩父子类

Father father = new Father();

father.setSex("女");

Son son = new Son();

son.setName("张天霸");

son.setMajor("维护地球");

son继承father类

 

通过反射获得Son属性列表

//只能获得当前类属性,不能获得父类属性

Field[] declaredFields = Son.class.getDeclaredFields();

Arrays.stream(declaredFields).map(s -> s.getName()).forEach(System.out::println);

打印结果为:
name
major

 

通过Inrospector获得属性列表

//同时获得当前类和父类属性

BeanInfo beanInfo = Introspector.getBeanInfo(Son.class);

//获得属性信息

List<PropertyDescriptor> propertyDescriptors =

Arrays.stream(beanInfo.getPropertyDescriptors())

.filter(i -> !"class".equals(i.getName()))

.collect(Collectors.toList());

propertyDescriptors.stream().map(p -> p.getName()).forEach(System.out::println);

该方式会额外多出来一个“class”属性,过滤掉就可以了
打印结构为:
major
name
sex

 

通过以上结果发现,反射确实只获得了当前类的属性,而Introspector可以获得所有属性。

 

接下来,看看两种方式获得属性,如何进行读写操作,一如既往先看反射方式

通过反射对Field进行处理

Arrays.stream(declaredFields).findFirst().ifPresent(s -> {

try {

System.out.println("属性名称:" + s.getName());

System.out.println("属性类型:" + s.getType());

//赋值必须设置private属性可以访问

s.setAccessible(true);

//赋值

s.set(son, s.getName() + ":我是新设置的属性");

//读取

System.out.println(s.get(son));

} catch (IllegalAccessException e) {

e.printStackTrace();

}

});

结果:
属性名称:name
属性类型:class java.lang.String
name:我是新设置的属性

 

通过Introspector方式对属性进行读写操作

propertyDescriptors.stream().findFirst().ifPresent(s -> {

try {

System.out.println("属性名称:" + s.getName());

System.out.println("属性类型:" + s.getPropertyType());

//赋值

s.getWriteMethod().invoke(son, s.getName() + ":我也是新设置的属性");

//读取

System.out.println(s.getReadMethod().invoke(son));

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

});

结果:
属性名称:major
属性类型:class java.lang.String
major:我也是新设置的属性

以上代码中使用java8特性,为节省篇幅,只对第一个属性进行了读写操作,达到演示效果就可以了。

 

当然也可以构建某个属性的PropertyDescriptor,针对性的进行赋值,读取操作

son.setName("刘佃亮");

PropertyDescriptor name = new PropertyDescriptor("name", Son.class);

System.out.println("修改前属性值:" + name.getReadMethod().invoke(son));

//赋值

name.getWriteMethod().invoke(son, "王俊国");

System.out.println("修改后属性值:" + name.getReadMethod().invoke(son));

结果:
修改前属性值:刘佃亮
修改后属性值:王俊国

 

欢迎探讨……

以上是 分别使用Reflect和Introspector对属性进行操作 的全部内容, 来源链接: utcz.com/z/515031.html

回到顶部