使用 AspectJ 将 toString 方法添加到 class

Add toString method to class using AspectJ

我有一个 class 无法修改,但我想更改其中一种方法的行为。

public class TestClass {
}

我想切入其中的 toString 方法,这样就不会 returning "TestClass@a8d8as" 而是 return "hello".

@Around("execution(* *(..)) && this(com.test.TestClass)")

如果我在 TestClass 中定义 toString 方法,这会起作用,但不能使用隐式方法。

我已经很长时间没有使用方面了,我对它们还很陌生,有没有我遗漏的东西或做我想做的事情的方法?

谢谢!

我要自己回答,这不是正确答案(如果有人能回答原文,即使现在不需要,也很好),但允许我做我想做的。

因为我只是想将 toString 添加到 Class,所以我更改了方法并直接使用 JavaAssist

import javassist.ClassPool
import javassist.ClassClassPath

val pool = ClassPool.getDefault
ClassPool.getDefault.insertClassPath(new ClassClassPath(this.getClass))
val cc = pool.get("TestClass")
cc.defrost()

val m = CtNewMethod.make(
  "public String toString() { return this.TableName }",
  cc
);
cc.addMethod(m);
cc.toClass

尽管已通过 Javassist 解决了问题,但您仍要求 AspectJ 解决方案。所以这里是根据Nándor的建议:

package de.scrum_master.app;

public class TestClass {
  private String tableName;

  public TestClass(String tableName) {
    this.tableName = tableName;
  }

  public static void main(String[] args) {
    System.out.println(new TestClass("Invoice"));
    System.out.println(new TestClass("InvoiceItem"));
  }
}
package de.scrum_master.aspect;

import de.scrum_master.app.TestClass;

public privileged aspect ToStringAspect {
  public String TestClass.toString() {
    return tableName;
  }
}

控制台日志:

Invoice
InvoiceItem