我有一个无法修改的类,但我想更改其中一种方法的行为。
public class TestClass {
}
我想在其中切入toString方法,以便与其返回“ TestClass @ a8d8as”,而不是返回“ hello”。
@Around("execution(* *(..)) && this(com.test.TestClass)")
如果我在TestClass内定义toString方法,则该方法有效,但不适用于隐式方法。
我已经很长时间没有使用过方面了,而我在这些方面还很陌生,是否有我所缺少的东西或者可以做自己想要的事情?
谢谢!
答案 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