将Spring的Proxy对象转换为实际的运行时类

时间:2011-05-12 09:52:43

标签: java spring

我正在使用Spring,我希望将对象强制转换为实际的运行时实现。

示例:

Class MyClass extends NotMyClass {
    InterfaceA a;
    InterfaceA getA() { return a; }

    myMethod(SomeObject o) { ((ImplementationOfA) getA()).methodA(o.getProperty()); }
}

由于ClassCastExceptiona对象,因此大喊$ProxyN。虽然在beans.xml中我注入了一个类ImplementationOfA的bean。

编辑1 我扩展了一个类,我需要在ImplementationOfA中调用一个方法。所以我想我需要施展。该方法接收参数。

编辑2

我最好扯掉目标类:

private T getTargetObject(Object proxy, Class targetClass) throws Exception {
    while( (AopUtils.isJdkDynamicProxy(proxy))) {
        return (T) getTargetObject(((Advised)proxy).getTargetSource().getTarget(), targetClass);
    }
    return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
}

我知道它不是很优雅但是很有效。

http://www.techper.net/2009/06/05/how-to-acess-target-object-behind-a-spring-proxy/的所有积分 谢谢!

4 个答案:

答案 0 :(得分:8)

你为什么要演员? 关于Spring proxy usage this is a great article,我建议您阅读,评论。

还有来自Spring AOP documentation的代理(7.1.3)部分。

答案 1 :(得分:7)

对于我来自 EDIT 2 的版本没有用。下面有一个工作:

@SuppressWarnings({"unchecked"})
protected <T> T getTargetObject(Object proxy) throws Exception {
    while( (AopUtils.isJdkDynamicProxy(proxy))) {
        return (T) getTargetObject(((Advised)proxy).getTargetSource().getTarget());
    }
    return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
}

用法:

    UserServicesImpl serviceImpl = getTargetObject(serviceProxy);
    serviceImpl.setUserDao(userDAO);

答案 2 :(得分:3)

现在您可以使用

AopTestUtils.getTargetObject(proxy)

实现与@siulkilulki建议相同,但在Spring帮助程序上

答案 3 :(得分:0)

基本上,当你在Spring中使用AOP时,Spring会为你构建一个代理。你有两个选择:

  1. 在实现接口的bean上应用方面时,在 这种情况下Spring使用JdkDynamicProxy
  2. 当你的spring bean没有实现任何接口时,如果你有 cglib 2.2在你的类路径中,考虑从你拥有的spring 3.2.x开始 默认情况下,弹簧容器中的cglib,sprirng使用特殊的 代理名为CGLibProxy。
  3. 关键点是,在你的bean上应用了一个方面Spring将实例化一个代理,如果你尝试执行一个转换,你将得到一个异常。

    我希望这可以帮到你