2011-05-12 49 views
12

我正在使用Spring,我希望将该对象转换为其实际的运行时实现。将Spring的代理对象投射到实际的运行时类

实施例:

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

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

即叫喊一个ClassCastException因为a$ProxyN对象。尽管在beans.xml中我注入了一个类ImplementationOfA的bean。

EDIT 1 我延伸的类和我需要在ImplementationOfA调用一种方法。所以我认为我需要演员。该方法接收一个参数。

EDIT 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/ 谢谢!

+1

这是不好的做法,实际实现类不应该是相关的。但是,这可能取决于您的代理是如何创建的。 – skaffman 2011-05-12 10:03:11

+0

如果您需要调用'ImplementationOfA'上的方法,然后将该方法添加到'InterfaceA'接口,或定义第二个接口并将该方法添加到该接口。 – skaffman 2011-05-12 10:32:14

+0

嗯,我知道这并不理想,但是我扩展的类实现了一个接口,并且由于应用程序的要求,我无法修改InterfaceA和NotMyClass。 – ssedano 2011-05-12 10:42:29

回答

0

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

  1. ,当你申请上实现接口豆方面,在 这种情况下,春季使用JdkDynamicProxy
  2. 当你的Spring bean没有实现任何接口,如果你有 CGLIB 2.2在你的classpath中,考虑从spring 3.2.x开始你在默认情况下在spring容器中有 csplib,sprirng使用一个叫做CGLibProxy的特殊 代理。

关键的一点是听到的是一个方面是应用在你的bean上Spring将实例化一个代理,如果你试图执行一个转换,你将会得到一个异常。

我希望塔这可以帮助你

4

对我来说版本从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);