【问题标题】:Autogenerating field methods自动生成字段方法
【发布时间】:2017-02-04 06:03:10
【问题描述】:

我对自动生成一些样板方法(类似于 Project Lombok)感兴趣。 Byte Buddy 友好的 API 似乎很有希望,但我不确定如何使用它。

这是一个简单的用例。假设我有一个类 User.java

public class User {
    private String name;
}

我计划用一个注释来装饰这个类,该注释将实现为此生成 getter 和 setter。使用 Byte Buddy,我尝试了以下方法:

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)

注意:我知道 Project Lombok 确实支持这一点,但这只是一个实验。我对另一个项目的注释驱动代码生成更感兴趣。这只是一个简单的例子,我想看看 Byte Buddy 是否适合这种用例。

任何帮助或指导将不胜感激!

【问题讨论】:

    标签: java auto-generate 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);
    

    您忘记添加参数类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      相关资源
      最近更新 更多