分别使用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