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 的代码。并且有 1000 多个地方可以创建 A。

似乎 Aspectj 可能会做到这一点,但我对此了解不多,如果 AspectJ 能做到这一点,我将如何绕过无限包装,我需要知道它是从内部和方面构建的,因此它不会再次包装它。

感谢乔恩的帮助

4

1 回答 1

6

如果我理解正确,您可以执行以下操作:

我创建了三个包:

封装结构

  • aspectj 用于方面和 AWrapped.java
  • A.java 未知(也可以是 Bytecode 但你必须使用Load Time Weaving
  • 主要测试A a = new A();

如果对 A 类进行调用,MyAspect 返回 AWrapped 对象new()

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 回答