一、情景
由于项目初期的架构设计缺陷,不同的功能模块划分给不同的团队成员开发,对于其中的一些对象的运行日志记录就会产生大量的打印代码。造成格式的不统一和代码量的增大。
在无法重构的情况下,设计一个通用的打印工具类就方便很多了。
二、示例
以下代码示例中,使用
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class Demo {
// 获取当前调用者的方法名
public static String methodName(){
// 注意:StackTrace是压栈的方式,由调用层级决定取第几个值
// 0是getStackTrace(), 1是methodName(), 2是printResultInfo(),3是main()
return Thread.currentThread().getStackTrace()[3].getMethodName();
}
// 反射调用方法
public static void callMethod(Object object, String... fields){
for (String field : fields) {
try {
PropertyDescriptor pd = new PropertyDescriptor(field, object.getClass());
Method method = pd.getReadMethod();
Object value = method.invoke(object);
System.out.println("field="+field+","+"value="+value);
}catch (Exception ex){
System.out.println(ex);
}
}
}
// 打印调用者方法名,以及响应码
public static void printResultInfo(Object object, String... fields){
System.out.println("Current method is call by "+ methodName());
callMethod(object, fields);
}
public static void main(String[] args) {
QueryUser queryUser = new QueryUser();
UpdateAccount updateAccount = new UpdateAccount();
queryUser.setCode("00"); //模拟运行成功
updateAccount.setCode("01"); //模拟运行失败
printResultInfo(queryUser, "code");
printResultInfo(updateAccount, "code");
}
}
三、总结
反射调用是java常用的手段,通过反射可以设计实现一个流程引擎或框架,也可以用作工具类。