软件:java8
问题
今天对自己写的代码分析,发现了很多不合适的地方,其中就有原先设计的bean不合理问题导致的后期需要重新侵入式的修改源代码,因此反射显得十分重要。
反射可以用于使用bean匹配数据时候,当bean本身发生变化的时候,如果不使用反射,则需要修改程序中的原始代码,修改bean的getter才能获取到新的数据。如果使用反射则不需要知道bean中具体目前有哪些属性,直接可以获取到属性列表,然后根据属性列表获得bean对应实例的值。只需要修改bean即可,而不需要修改调用bean初的其他逻辑代码。
假设有个Person类
public class Person { private String name; private int age; private String gender; }
|
如果不使用反射,如果为Person增加了一个新的属性,则需要修改调用逻辑的源代码。
@Test void test1() { Person a = new Person("pc",26,"male"); List<String> fieldsNames = new ArrayList<>(); fieldsNames.add("name"); fieldsNames.add("age"); fieldsNames.add("gender"); System.out.println(String.join(",",fieldsNames)); List<String> fieldsValues = new ArrayList<>(); fieldsValues.add(a.getName()); fieldsValues.add(a.getAge()); fieldsValues.add(a.getGender()); System.out.println(String.join(",",fieldsValues)); }
|
现在使用反射读取Person类的私有属性名称,并且读取实例的私有属性。如果修改了Person类属性,可以看到这段代码不需要做任何修改。
@Test void test2() throws IllegalAccessException { Person a = new Person("pc",26,"male");
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));
}
|