Меня интересует автоматическое генерирование некоторых методов плиты котла (аналогично проекту Lombok). Байт дружелюбный API API кажется многообещающим, но я не уверен, как его использовать.Методы автогенерации
Вот простой случай использования. Допустим, у меня есть класс User.java
public class User {
private String name;
}
Я планирую украсить этот класс с аннотациями, которые имели бы реализацию генерации геттер и сеттер для этого. Использование Byte Бадди, я попробовал следующее:
public class MethodInterceptor {
public static void main(String[] args) throws Exception {
User user = new ByteBuddy()
.subclass(User.class)
.defineMethod("getName", String.class, Visibility.PUBLIC)
.intercept(FieldAccessor.ofBeanProperty())
.defineMethod("setName", Void.TYPE, Visibility.PUBLIC)
.withParameter(String.class)
.intercept(FieldAccessor.ofBeanProperty())
.make()
.load(User.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded().newInstance();
user.getClass().getDeclaredMethod("setName").invoke("Jaypal");
Method m = user.getClass().getDeclaredMethod("getName");
System.out.println((String) m.invoke(null));
}
}
Однако я получаю исключение
Exception in thread "main" java.lang.NoSuchMethodException: scratchpad.User$ByteBuddy$n0KYCYB5.setName()
at java.lang.Class.getDeclaredMethod(Class.java:2130)
at scratchpad.MethodInterceptor.main(MethodInterceptor.java:22)
Примечание: Я знаю, что проект Ломбок не поддерживает это, однако это всего лишь эксперимент. Меня больше интересует генерация кода привода аннотаций для другого проекта. Это просто простой пример. Я пытаюсь выяснить, подходит ли Byte Buddy для такого варианта использования.
Любая помощь или руководство будут высоко оценены!
О, дерьмо. Извини за это. Но я должен сказать, какую красивую библиотеку вы написали в ByteBuddy. Спасибо огромное! –
Как мы обходим проверку времени компиляции метода, который я генерирую во время выполнения? То, что я пытаюсь сделать, это аннотировать поля, которые будут создавать методы, основанные на аннотации во время выполнения. Тем не менее, я бы хотел, чтобы мои тесты использовали эти методы, но компилятор мешает, так как он еще не определен. Извинения за отправку дополнительного вопроса в качестве комментария. –