【发布时间】:2017-05-31 20:28:38
【问题描述】:
我写了这个例子:
E someCreateMethod(Class<E> clazz) {
Class<? extends E> dynamicType = new ByteBuddy()
.subclass(clazz)
.name("NewEntity")
.method(named("getNumber"))
.intercept(FixedValue.value(100))
.defineField("stringVal", String.class, Visibility.PRIVATE)
.defineMethod("getStringVal", String.class, Visibility.PUBLIC)
.intercept(FieldAccessor.ofBeanProperty())
.make()
.load(clazz.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
return dynamicType.newInstance();
}
我想用它来获得重新定义的number属性:
Integer num = someCreateMethod(EntityExample.class).getNumber(); //(1)
或者获取新定义的stringVal属性:
String sVal = someCreateMethod(EntityExample.class).getStringVal(); //(2)
我的问题是 (1) 工作得很好,而 (2) 却不行。我收到以下错误:
Error:(40, 67) java: cannot find symbol
symbol: method getStringVal()
另外,是否可以使用动态生成的类来做这样的事情:
NewEntity newEntity = someCreateMethod(EntityExample.class);
Integer num = newEntity.getNumber();
String sVal = newEntity.getStringVal();
?
编辑:感谢您的帮助,这个示例是我第一次尝试使用 ByteBuddy 库。我认为defineMethod 实际上定义了接口方法的实现,而不仅仅是向类添加随机方法。所以我决定在这里解释一下我到底想要完成什么。
对于 E 类中的每个 Date 属性,我想再添加两个字段(以及它们各自的 getter 和 setter),比如说 (atribute name)InitialDate 和 (atribute name)FinalDate,这样我就可以为每个日期使用间隔功能在E。
我想知道是否可以使用代码生成来添加这些方法,而不必为每个 E 创建子类。
PS:E 无法更改,它属于旧版模块。
PS2:我不知道每个实体E中会有多少个日期属性,但新的属性和方法将使用约定创建(例如__FisrtDay,__LastDay),如下图所示:
NewA a = eb.create(A.class);
a.getDeadLine(); //inherited
a.getDeadLineFirstDay(); //added
a.getDeadLineLastDay(); //added
NewA b = eb.create(B.class);
b.getBirthday(); //inherited
b.getBirthdayFirstDay(); //added
b.getBirthdayLastDay(); //added
b.getAnniversary(); //inherited
b.getAnniversaryFirstDay(); //added
b.getAnniversaryLastDay(); //added
PS3:我想要通过 ByteBuddy 实现的目标是否可行?还有其他方法吗?
PS4:我的编辑应该是一个新问题吗?
【问题讨论】:
-
我猜
getNumber是在EntityExample接口中定义的,而getStringVal没有。 -
另外,请原谅我提出的愚蠢问题……但你认为你为什么要这样做?
-
@Joe C 好吧,ByteBuddy 让我们定义新方法,对吧? (因为“.defineMethod”部分)所以我认为它应该给我们一些方法来访问我们正在创建的方法......我只是不知道该怎么做。至于您的第二条评论,我需要动态创建我作为参数传递给方法“someCreateMethod”的任何类的子类,并且这些子类应该实现两个新方法。这就是我想要这个的原因。
标签: java code-generation byte-buddy