2017-02-04 59 views
0

我对自动生成一些锅炉板方法感兴趣(类似于龙目岛项目)。 Byte Buddy友好API似乎很有前途,但我不确定如何去使用它。自动生成现场方法

这是一个简单的用例。可以说,我有一个类User.java

public class User { 
    private String name; 
} 

我打算用这将有产生getter和setter这个的实现注释修饰这个类。使用字节伙计,我试过如下:

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) 

声明一个方法,你通过

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

你忘了添加参数类型声明方法

public void setName(String s); 

此方法可用。

+0

哦,废话。对于那个很抱歉。但是我必须说一下你在ByteBuddy写的美丽的图书馆。非常感谢! –

+0

我们如何绕过我在运行时生成的方法的编译时检查?我想要做的是注释字段,它将在运行时基于注释创建方法。不过,我希望我的测试能够使用这些方法,但编译器会因为尚未定义的方式而受阻碍。抱歉发布其他问题作为评论。 –