怎样利用反射批量修改java类某一属性的代码详解
心寒丶 人气:0本文着重讲解了怎样利用反射批量修改java类某一属性,文中会用代码示例为大家做详细介绍,希望能够帮助到您,欢迎大家阅读和收藏
下面看下代码,具体代码如下所示:
package utils.copyProperty; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; public class CopyProperty { public static PropertyDescriptor[] getPropertyDescriptor(Class<?> clz) throws Exception { PropertyDescriptor[] propertyDescriptorsFull = Introspector.getBeanInfo(clz).getPropertyDescriptors(); PropertyDescriptor[] ps = new PropertyDescriptor[propertyDescriptorsFull.length - 1]; int index = 0; for (PropertyDescriptor p : propertyDescriptorsFull) { if (!p.getName().equals("class")) { ps[index++] = p; } } return ps; } public static <T> T setPropertyValue(T t,String propertyName,Object value){ try{ //获取属性描述类 PropertyDescriptor[] pdArr = getPropertyDescriptor(t.getClass()); PropertyDescriptor myPD = null; for (PropertyDescriptor p : pdArr) { //类属性与传入属性对比,为了统一都转小写 if(p.getName().toLowerCase().equals(propertyName.toLowerCase())){ //获取需要修改属性 myPD = p; break; } } //根据需要修改属性,修改属性值 if(myPD!=null){ Method writeMethod = myPD.getWriteMethod(); if(myPD.getPropertyType().getName().equals("java.lang.String")) { writeMethod.invoke(t, value.toString()); }else{ writeMethod.invoke(t, value); } } }catch(Exception e){ e.printStackTrace(); } return t; } public static <T>Collection<T> setPropertyValue(Collection<T> coll,String propertyName,Object value) { if(coll!=null) for(T t : coll){ setPropertyValue(t,propertyName,value); } return coll; } public static void main(String args[]) throws Exception{ ArrayList<Student> students=new ArrayList(); Student student=new Student(); Student student1=new Student(); students.add(student); students.add(student1); for (Student stu:students){ System.out.println("赋值之前:"+stu.getValidStatus()); }//修改validStatus为0 CopyProperty.setPropertyValue(students, "validStatus", "0"); for (Student stu:students){ System.out.println("赋值之后:"+stu.getValidStatus()); } } public static class Student{ private String name ; private String sex; private String validStatus="1"; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getValidStatus() { return validStatus; } public void setValidStatus(String validStatus) { this.validStatus = validStatus; } } }
把student的validStatus状态都修改为0,测试效果如下:
加载全部内容