我第一次使用java.util.concurrency
框架。这是我正在做的非常简化的版本。对于那些不熟悉框架的人,future.get()
执行将来定义的Callable
对象。 future.getOriginatingRequest()
返回我将来设置的对象以供Callable
对象使用,我只是想记录哪个原始请求对象失败(足以知道它的类名)。
try {
future.get();
} catch (ExecutionException e) {
logger.error("Failed to execute future with id '" +
future.getOriginatingRequest().getClass().getName() + "'");
}
我遇到的问题是日志框架正在输出:
Failed to execute future with id '$Proxy22'
因此,我得到$Proxy22
或其他一些数字,而不是真正的班级名称。有没有办法获得真正的类名而不是代理名?奖励积分是有人可以清楚地解释为什么我首先得到代理字符串!
答案 0 :(得分:3)
我可以回答红利问题:字符串是在运行时生成的动态Proxy
类的名称。
至于如何进入蒙面课程,甚至根本不保证一个人存在。你唯一能做的就是在代理对象上调用Proxy.getInvocationHandler()
,并希望调用处理程序能够显示更多信息(不太可能,但可能值得一试)。
答案 1 :(得分:1)
我在http://www.techper.net/2009/06/05/how-to-acess-target-object-behind-a-spring-proxy/
找到了解决方案@SuppressWarnings({"unchecked"})
protected <T> T getTargetObject(Object proxy, Class<T> targetClass) throws Exception {
if (AopUtils.isJdkDynamicProxy(proxy)) {
return (T) ((Advised)proxy).getTargetSource().getTarget();
} else {
return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
}
}
用法
@Override
protected void onSetUp() throws Exception {
getTargetObject(fooBean, FooBeanImpl.class).setBarRepository(new MyStubBarRepository());
}
答案 2 :(得分:-1)
我猜测代理类是您正在寻找的类的子类。特别是如果你要找的课是你写的课。
你可以访问你找到的对象的继承树吗?也许通过反思?