场景:
在类中注入DAO接口,如Mapper,实际是一个代理接口,单元测试的时候模拟SQL语句返回结果。
上一篇文章使用Setter方法改变代理接口为Mock类
但是会对代码有所改变,侵入性太强,不合理,所以此次使用反射机制来改变类的属性
/**
* 改变目标类的属性
* @param candidate 目标类
* @param fieldName 属性名
* @param fieldObject 属性类
*/
public void changeTargetField(Object candidate, String fieldName, Object fieldObject) {
if (candidate instanceof Advised) {
TargetSource targetSource =((Advised) candidate).getTargetSource();
if (targetSource instanceof SingletonTargetSource) {
Object target = ((SingletonTargetSource) targetSource).getTarget();
try {
Field field = candidate.getClass().getSuperclass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(target, fieldObject);
return;
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException("代理类设置属性失败");
}
}
throw new RuntimeException("未找到代理类");
} else {
try {
Field field = candidate.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(candidate, fieldObject);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException("目标类设置属性失败");
}
}
}
网友评论