今天在写修改接口的时候忽然遇到这样一个问题:
需要根据输入的修改对象及参数数组,记录需要修改属性的被修改前的值以及修改值。
在实现的过程中,遇到的核心问题规约为:
输入一个参数数组,需要根据这个参数数组中的参数,来遍历执行对应的get方法。
比如输入中有name,那么我需要执行getName();
似乎有点不好实现,甚至有点不现实,毕竟我们不能在代码中写诸如get+‘Name’+();这么不现实的东西啊。
开玩笑开玩笑。
那么如何通过输入参数调用对应的方法呢?
伟大的java先驱者已经为我们想到了,我们可以利用java反射这个特性来实现。
回过头来想,第一次在看反射的时候一脸懵内心总是在想:这玩意儿有啥用啊。
话不多说直接上代码
//activity即需要修改属性对象的bean
Class<?> clazz = activity.getClass();//获取对应方法所属对象类
//params为传入的的参数数组,此处获取一个需要修改的参数
String param=params.get(i);
String str=param.substring(0, 1).toUpperCase() + param.substring(1);
try {
Method getMethod = clazz.getDeclaredMethod("get"+str);//通过String获取方法
//利用changeLog对象记录修改前和修改后的值
changeLog.setPreValue((String) getMethod.invoke(oldActivity));//执行对应方法
changeLog.setAfterValue((String) getMethod.invoke(activity));
}catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
大功告成
其中关键步骤为
Class<?> clazz = activity.getClass();//获取对应方法所属对象类
Method getMethod = clazz.getDeclaredMethod("get"+str);//通过String获取方法
getMethod.invoke(activity));//执行对应方法