如何获取代理类的名称?

时间:2011-01-14 13:59:38

标签: java logging concurrency proxy

我第一次使用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或其他一些数字,而不是真正的班级名称。有没有办法获得真正的类名而不是代理名?奖励积分是有人可以清楚地解释为什么我首先得到代理字符串!

3 个答案:

答案 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)

我猜测代理类是您正在寻找的类的子类。特别是如果你要找的课是你写的课。

你可以访问你找到的对象的继承树吗?也许通过反思?