如何通过环绕构造函数替换类型的实例?

时间:2013-01-08 13:12:56

标签: java spring aspectj

我有一个遗留的lib,可以创建BeanProxy的实例。不幸的是,这个实现有一个我想修复的缺陷。由于我不想开始使用修补的库,我想创建一个包含BeanProxy构造的Aspect并返回我修改的BeanProxy子类型的实例。

我创建了以下Aspect,只要创建了BeanProxy的新实例,它就会被正确编织和调用:

@Aspect
public class CWebBeanProxyInjectingAspect {

    @Pointcut("execution(public flex.messaging.io.BeanProxy.new(..))")
    void createBeanProxy() {}

    @Around("createBeanProxy()")
    public Object createAlternateBeanProxy(final ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("createAlternateBeanProxy");
        final Object result = pjp.proceed();
        System.out.println(result);
        return result;
    }
}

不幸的是result总是null ...我做错了什么?我需要改变什么? 我应该提一下,我使用AspectJ LoadTimeWeaving和spring-instrument-3.1.1.RELEASE.jar作为代理。

1 个答案:

答案 0 :(得分:1)

构造函数execution不返回任何内容(void)。如果要返回创建的对象,请在切入点中使用call

  @Pointcut("call(public flex.messaging.io.BeanProxy.new(..))")
    void createBeanProxy() {}

参见 Contstructor call Constructor execution http://www.eclipse.org/aspectj/doc/next/progguide/semantics-joinPoints.html