反射

142 阅读1分钟

1.反射的初步理解。

案例

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WishBillFileWTRBO {
    // Date
    private String date;
    // Order ID
    private String orderId;
    // Currency
    private String currency;
    // Amount Released
    private String amountReleased;
    // Tax Released
    private String taxReleased;
    // Amount Paid
    private String amountPaid;
}
private static void _setFieldValue(String[] lineArray, Map<String, Map<Integer, String>> indexTitleMap, Map<String, Map<String, String>> titleFieldMap, Object object, String label) throws Exception{

        Map<Integer, String> titleMap = indexTitleMap.get(label);
        Map<String, String> fieldMap = titleFieldMap.get(label);

        // 赋值
        for (Map.Entry<Integer, String> entry : titleMap.entrySet()) {
            int index = entry.getKey();
            String fieldValue = lineArray[index].trim();
            String title = entry.getValue();
            String fieldName = fieldMap.get(title);
            WishBillReflexUtil.setFieldValueByFieldName(fieldName, fieldValue, object);
        }
    }
public static void setFieldValueByFieldNameAndFieldType(String fieldName, Object fieldValue, Object object, Class<?> fieldType) throws Exception{
        Field[] fields = object.getClass().getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];
            //字段名称
            String name = field.getName();
            if (name.equals(fieldName)) {
                field.setAccessible(true);
                //field.set(object,fieldValue) 可代替下面的拼接set方法;
                //将属性的首字符大写,方便构造getset方法
                String methname = String.format("%s%s", name.substring(0, 1).toUpperCase(), name.substring(1));
                Method m = object.getClass().getMethod(String.format("%s%s", "set", methname), fieldType == null ? String.class : fieldType);
                m.invoke(object, fieldValue);
            }
        }
    }

经过阅读导师写的代码WishBillConvertData2BO ,总结出了两点, 其一,反射的作用就是跳过了JVM上层的保护机制(比如private修饰的方法、属性), 直接到达JVM,直接为需要的对象属性赋值或者调用相应的方法。 其二,避免了在多个地方写比如set,get等方法,降低了代码的冗余度,实现某种深度抽象, 提高了代码的可维护度。总之,现代机器发展的这么好了,也不用考虑反射机制带来的硬件性能的问题了。

2.反射的进步理解。

这个