2012-04-24 48 views
2

我想从调用的对象返回更改为constuctorAspectJ的构造力工厂模式

FROM

public class A { 

    public A(){ 
    } 

    public String sayHello() { 
    return "hello"; 
    } 

    public String foo() { 
     return "foo"; 
    } 

} 

TO

public class AWrapped extends A { 

    private A wrapped; 

    public AWrapped() { 
     super(); 
    } 


    public AWrapped(A pWrapped) { 
     wrapped=pWrapped; 
    } 

    public String foo() { 
     return wrapped.foo(); 
    } 

    public String sayHello { 
     return "gday mate"; 
    } 

} 

我想要做的是什么更改通话返回的对象

A a = new A(); 
a.sayHello() returns "gday mate" 

一个是instaceof AWrapped

我明白,这通常会用工厂模式来完成,但我没有访问的代码或使新A的代码。 A可以创建的地方有1000个。

看来,Aspectj可能会做的伎俩,但我不太了解它,如果AspectJ会做的窍门如何绕过无限包装我需要知道它从内部和方面构建,所以它不会再次包装它。

感谢您的帮助 乔恩

+0

如果你稍后创建一个'new A()',它仍然会说“你好”。猜猜,你最后一个例子的第一行应该是'A a = new AWrapped()' – 2012-04-24 04:20:14

+1

感谢Marko,这是有道理的,我仍然需要解决这个问题,所以我会尝试做一个自定义类加载器,看看我能不能得到在那附近。再次感谢 – user898333 2012-04-26 01:01:00

+0

@ user898333,这似乎是要走的路。请一旦你解决了你的问题,在这里发布它的大纲作为你的问题的答案。 – Yaneeve 2012-04-27 07:42:31

回答

6

如果我理解你的权利,你可以做到以下几点:

我已经创建了三个包:

package structure

  • 的AspectJ的方面和AWrapped.java
  • A.java未知(也可能是b Ë字节码但你必须使用Load Time Weaving
  • 主要测试A a = new A();

MyAspect返回AWrapped对象,如果一个new()呼叫在A级制作:

package aspectj; 

import unknown.A; 

@Aspect 
public class MyAspect { 

    @Pointcut("call(unknown.A.new(..)) && !within(aspectj..*)") 
    public static void init(ProceedingJoinPoint pjp) { 
    } 

    @Around("init(pjp)") 
    public Object initAdvice(ProceedingJoinPoint pjp) throws Throwable{ 
     Object ret = pjp.proceed(); 
     return new AWrapped((A) ret); 
     } 

} 

来进行测试:

package main; 

import unknown.A; 

public class Main { 

    public static void main(String[] args) { 
     A a = new A(); 
     System.out.println(a.sayHello()); 
    } 
} 

此输出:

gday mate 
+0

太棒了,击败了我! – 2012-05-02 14:52:53