В настоящее время я пишу плагин maven, который предоставляет данной библиотеке расширенные методы получения для всех свойств, которые содержат определенную аннотацию в качестве маркера.
Код: Выделить всё
@Reference(name="address", targetType=Address.class)
protected String addressId;
должен получиться метод получения со следующей сигнатурой:
Код: Выделить всё
public Address getAddress() {
return ReferenceResolver.resolve(this, addressId, Address.class);
}
Детали того, что делает преобразователь, по сути не имеют значения, но сигнатура методаsolve() следующая:
Код: Выделить всё
public T resolve(StoredObject source, String key, Class targetType)
В методе apply() плагина я просматриваю поля с их именами и соответствующую аннотацию с ожидаемым именем и типом метода получения свойства.< /p>
Код: Выделить всё
builder = builder.defineMethod( "get" + name, targetType, Visibility.PUBLIC )
.intercept(MethodCall.invoke(delegate)
.withThis()
.withField(field.getName())
.with(targetType));
Это работает, пока targetType имеет значение StoredObject.class, но как только targetType установлен на ожидаемый целевой тип Address.class , который наследуется от StoredObject, построитель выдает следующее сообщение:
Код: Выделить всё
Failed to transform class maku.User: [java.lang.IllegalStateException: Cannot return T from public maku.Address maku.User.getAddress()]
Распознаватель выполняет необходимые проверки, чтобы гарантировать, что возвращаемое значение можно присвоить ожидаемому целевому типу, и возвращает значения, приведенные к T. Однако каким-то образом сгенерированный код не может правильно разрешить возвращенный T, поскольку его ограниченный тип StoredObject является суперклассом ожидаемого типа, и поэтому неясно, вернет ли его приведение правильное значение.
Я считаю, что мне нужно выполнить одно из следующих действий, чтобы это заработало:
- Мне либо нужно ослабить ограничения на возвращаемый тип в ByteBuddy,
- или мне нужно самому привести возвращаемое значение к ожидаемому типу,
- Мне нужно привязать переменную общего типа T к ожидаемому типу.
Я не нашел способа, известного как пример, показывающий, как это сделать. Я что-то просмотрел или это просто невозможно?
Подробнее здесь:
https://stackoverflow.com/questions/785 ... eturn-type