自动生成字段方法
Autogenerating field methods
我对自动生成一些样板方法很感兴趣(类似于 Project Lombok)。 Byte Buddy friendly API 看起来很有前途,但我不确定如何使用它。
这是一个简单的用例。假设我有一个 class User.java
public class User {
private String name;
}
我计划用注释装饰此 class,该注释将实现为此生成 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 是否适合这种用例。
任何帮助或指导将不胜感激!
通过
声明一个方法
builder.defineMethod("setName", Void.TYPE, Visibility.PUBLIC)
.withParameter(String.class)
您正在声明方法
public void setName(String s);
此方法可通过
获得
Method method = clazz.getDeclaredMethod("setName", String.class);
您忘记添加参数类型了。
我对自动生成一些样板方法很感兴趣(类似于 Project Lombok)。 Byte Buddy friendly API 看起来很有前途,但我不确定如何使用它。
这是一个简单的用例。假设我有一个 class User.java
public class User {
private String name;
}
我计划用注释装饰此 class,该注释将实现为此生成 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 是否适合这种用例。
任何帮助或指导将不胜感激!
通过
声明一个方法builder.defineMethod("setName", Void.TYPE, Visibility.PUBLIC)
.withParameter(String.class)
您正在声明方法
public void setName(String s);
此方法可通过
获得Method method = clazz.getDeclaredMethod("setName", String.class);
您忘记添加参数类型了。