使用AspectJ将toString方法添加到类中

时间:2019-03-17 18:40:14

标签: aop aspectj

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

public class TestClass {
}

我想在其中切入toString方法,以便与其返回“ TestClass @ a8d8as”,而不是返回“ hello”。

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

如果我在TestClass内定义toString方法,则该方法有效,但不适用于隐式方法。

我已经很长时间没有使用过方面了,而我在这些方面还很陌生,是否有我所缺少的东西或者可以做自己想要的事情?

谢谢!

2 个答案:

答案 0 :(得分:1)

尽管通过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

答案 1 :(得分:0)

我要自我回答,它不是正确的答案(如果有人可以回答原始内容,即使现在不需要,也可以),但是我可以做我想做的事。

我只是想将toString添加到类中,所以我更改了方法,直接使用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