Добавьте метод toString в класс, используя AspectJ - PullRequest
0 голосов
/ 17 марта 2019

У меня есть класс, который я не могу изменить, но я хочу изменить поведение одного из его методов.

public class TestClass {
}

Я хотел бы указать внутри него метод toString, чтобы вместо возврата«TestClass @ a8d8as» возвращает «привет».

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

Это работает, если я определяю метод toString внутри TestClass, но не буду работать с неявным.

У меня естьдолгое время не работал с аспектами, и я в них совсем новичок, я что-то упускаю или могу делать то, что хочу?

Спасибо!

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Вы запросили решение AspectJ, несмотря на то, что решили проблему через Javassist.Так вот, согласно предложению Нандора:

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
0 голосов
/ 17 марта 2019

Я собираюсь ответить самому себе, это не правильный ответ (если кто-то может ответить на оригинал, даже если он не нужен сейчас, может быть хорошим), но позволил мне сделать то, что я хотел.

Поскольку я просто хотел добавить 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
...