2

オブジェクトの戻り値を呼び出しからコンストラクターに変更したい

から

public class A  {

   public A(){
   }

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

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

}

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"

a は AWrapped のインスタンスです

これは通常、ファクトリ パターンで行われることは理解していますが、A のコードや新しい A を作成するコードにはアクセスできません。そして、Aを作成できる場所は何千もあります。

Aspectj がトリックを実行する可能性があるようですが、私はそれについてあまり知りません。AspectJ がトリックを実行する場合、無限のラッピングを回避する方法を知る必要があります。

助けてくれてありがとうジョン

4

1 に答える 1

6

私があなたを正しく理解していれば、次のことができます:

3 つのパッケージを作成しました。

パッケージ構造

  • アスペクトとAWrapped.javaのaspectj
  • A.java については不明です (バイトコードの可能性もありますが、Load Time Weavingを使用する必要があります)
  • メインのテストA a = new A();

new()MyAspect を使用して、クラス A で呼び出しが行われた場合に AWrapped オブジェクトを返します。

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
于 2012-05-02T14:22:06.643 に答える