2012-04-24 79 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