软件:java8

问题

今天对自己写的代码分析,发现了很多不合适的地方,其中就有原先设计的bean不合理问题导致的后期需要重新侵入式的修改源代码,因此反射显得十分重要。


反射可以用于使用bean匹配数据时候,当bean本身发生变化的时候,如果不使用反射,则需要修改程序中的原始代码,修改bean的getter才能获取到新的数据。如果使用反射则不需要知道bean中具体目前有哪些属性,直接可以获取到属性列表,然后根据属性列表获得bean对应实例的值。只需要修改bean即可,而不需要修改调用bean初的其他逻辑代码。

假设有个Person类

public class Person {
private String name;
private int age;
private String gender;
//private String city; //假设增加了一个新的属性city
// 省略get,set,有参空参构造,toString()
}

如果不使用反射,如果为Person增加了一个新的属性,则需要修改调用逻辑的源代码。

@Test
void test1() {
Person a = new Person("pc",26,"male");

//这里需要手动输入Person的私有属性名称,并且如果Person修改了属性,则这里也需要手动修改
List<String> fieldsNames = new ArrayList<>();
fieldsNames.add("name");
fieldsNames.add("age");
fieldsNames.add("gender");
//fieldsNames.add("city");
System.out.println(String.join(",",fieldsNames));

//这里需要手动调用Person的私有属性getter方法,并且如果Person修改了属性,则这里也需要手动修改
List<String> fieldsValues = new ArrayList<>();
fieldsValues.add(a.getName());
fieldsValues.add(a.getAge());
fieldsValues.add(a.getGender());
//fieldsValues.add(a.getCity());
System.out.println(String.join(",",fieldsValues));
}

现在使用反射读取Person类的私有属性名称,并且读取实例的私有属性。如果修改了Person类属性,可以看到这段代码不需要做任何修改。

@Test
void test2() throws IllegalAccessException {
Person a = new Person("pc",26,"male");

//方式1
//Class clazz = a.getClass();
//Field[] fields = clazz.getDeclaredFields();

//方式2
Class clazz = Person.class;
Field[] fields = clazz.getDeclaredFields();

//获取类私有属性名称
List<String> fieldsNames = new ArrayList<>();
for(Field field: fields){
field.setAccessible(true);//对于私有属性必须要将访问权限打开
fieldsNames.add(field.getName());
}
System.out.println(String.join(",",fieldsNames));

//获取类实例的属性值
List<String> fieldsValues = new ArrayList<>();
for(Field field: fields){
field.setAccessible(true);//对于私有属性必须要将访问权限打开
fieldsValues.add(field.get(a).toString());
}
System.out.println(String.join(",",fieldsValues));

}