2017-02-04 20 views
0

Меня интересует автоматическое генерирование некоторых методов плиты котла (аналогично проекту 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 для такого варианта использования.

Любая помощь или руководство будут высоко оценены!

ответ

1

Объявив метод с помощью

builder.defineMethod("setName", Void.TYPE, Visibility.PUBLIC) 
     .withParameter(String.class) 

вы объявляете метод

public void setName(String s); 

Этот метод доступен через

Method method = clazz.getDeclaredMethod("setName", String.class); 

Вы забыли добавить тип параметра.

+0

О, дерьмо. Извини за это. Но я должен сказать, какую красивую библиотеку вы написали в ByteBuddy. Спасибо огромное! –

+0

Как мы обходим проверку времени компиляции метода, который я генерирую во время выполнения? То, что я пытаюсь сделать, это аннотировать поля, которые будут создавать методы, основанные на аннотации во время выполнения. Тем не менее, я бы хотел, чтобы мои тесты использовали эти методы, но компилятор мешает, так как он еще не определен. Извинения за отправку дополнительного вопроса в качестве комментария. –