Я написал этот пример:
E someCreateMethod(Class<E> clazz) {
Class<? extends E> dynamicType = new ByteBuddy()
.subclass(clazz)
.name("NewEntity")
.method(named("getNumber"))
.intercept(FixedValue.value(100))
.defineField("stringVal", String.class, Visibility.PRIVATE)
.defineMethod("getStringVal", String.class, Visibility.PUBLIC)
.intercept(FieldAccessor.ofBeanProperty())
.make()
.load(clazz.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
return dynamicType.newInstance();
}
И я хотел бы использовать его для получения переопределенного атрибута number
:
Integer num = someCreateMethod(EntityExample.class).getNumber(); //(1)
Или, чтобы получить вновь определенный атрибут stringVal
:
String sVal = someCreateMethod(EntityExample.class).getStringVal(); //(2)
Моя проблема в том, что (1) работает очень хорошо, а (2) нет. Я получаю следующую ошибку:
Error:(40, 67) java: cannot find symbol
symbol: method getStringVal()
Кроме того, можно ли сделать что-то подобное с динамически сгенерированным классом:
NewEntity newEntity = someCreateMethod(EntityExample.class);
Integer num = newEntity.getNumber();
String sVal = newEntity.getStringVal();
?
РЕДАКТИРОВАТЬ: я ценю вашу помощь, этот пример был моей первой попыткой использования библиотеки ByteBuddy. Я понял, что defineMethod
на самом деле определяет реализацию метода интерфейса, а не просто добавляет случайный метод в класс. Поэтому я решил объяснить здесь, чего именно я пытаюсь достичь.
Для каждого атрибута Date
в классе E я хочу добавить еще два поля (и соответствующие им геттеры и сеттеры), скажем, (atribute name)InitialDate
и (atribute name)FinalDate
, чтобы я мог использовать функциональные интервалы для каждой даты в E
.
Мне было интересно, могу ли я использовать генерацию кода для добавления этих методов без необходимости создавать подклассы для каждого E
.
PS: E
изменить нельзя, он принадлежит устаревшему модулю.
PS2: я не знаю, сколько атрибутов даты будет в каждой сущности E
, но новые атрибуты и методы будут созданы с использованием соглашений (например, __FisrtDay
, __LastDay
), как показано ниже:
NewA a = eb.create(A.class);
a.getDeadLine(); //inherited
a.getDeadLineFirstDay(); //added
a.getDeadLineLastDay(); //added
NewA b = eb.create(B.class);
b.getBirthday(); //inherited
b.getBirthdayFirstDay(); //added
b.getBirthdayLastDay(); //added
b.getAnniversary(); //inherited
b.getAnniversaryFirstDay(); //added
b.getAnniversaryLastDay(); //added
PS3: То, что я пытаюсь сделать, возможно с ByteBuddy или вообще возможно? Есть ли другой способ?
PS4: Должен ли мой РЕДАКТИРОВАТЬ быть новым вопросом?
getNumber
определен в интерфейсеEntityExample
, аgetStringVal
— нет. - person Joe C   schedule 17.01.2017