Опит за вплитане в метод по подразбиране toString() за голям брой DTO, като се използва само вплитане по време на компилиране. Целта е да се върне JSON представяне с помощта на библиотеката Jackson.
Следвах предложенията в тази статия, превърнах я в конфигурация на аспект в стил на анотация и завърши със следния код:
public @Aspect class JsonToStringAspect {
private interface JsonToString {
public String toString();
}
public static class JsonToStringImpl implements JsonToString {
public String toString() {
return SingletonJsonEncoder.toJsonString(this);
}
}
@SuppressWarnings("unused")
@DeclareParents(value = "com.mycompany.dto..*", defaultImpl = JsonToStringImpl.class)
private JsonToString implementedInterface;
}
Изпълнението на javap
на получените класове показва, че те имплементират интерфейса JsonToString, но никъде няма знак за метода toString().
Ако променя името на метода на нещо, което не се сблъсква с Object.toString() (напр. toString2()), методът наистина се добавя.
Някакви улики как да се преодолее това? Може би @Around
съвет относно pointcut, който прихваща изпълнението на java.lang.Object.toString(), само за детски класове под пакет com.mycompany.dto
? Или начин да принудите миксина да се случи?
toString()
метод. Очевидно това помага да запазите вашитеtoString()
методи СУХИ, но също така е и малко неочевидна магия това прави кодовата база по-сложна. - person SingleShot   schedule 13.01.2013