Как создать установщик поля с помощью byte buddy? Каков рекомендуемый синтаксис?
Мне удалось создать геттер из поля (мой исходный вопрос здесь), но использование defineMethod
для создания установщика вызывает исключение Method Implementation.Context.Default
... is no bean property
.
Предлагаемый способ создания установщика в этом вопросе кажется быть устаревшим.
Вот мой ошибочный код, использующий версию 1.5.4 byte-buddy:
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException {
Class<?> type = new ByteBuddy()
.subclass(Object.class)
.name("domain")
.defineField("id", int.class, Visibility.PRIVATE)
.defineMethod("getId", int.class, Visibility.PUBLIC).intercept(FieldAccessor.ofBeanProperty())
.defineMethod("setId", Void.TYPE, Visibility.PUBLIC).intercept(FieldAccessor.ofBeanProperty())
.make()
.load(sample.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
Object o = type.newInstance();
Field f = o.getClass().getDeclaredField("id");
f.setAccessible(true);
System.out.println(o.toString());
Method m = o.getClass().getDeclaredMethod("getId");
System.out.println(m.getName());
Method s = o.getClass().getDeclaredMethod("setId", int.class);
System.out.println(s.getName());
}