Rot*_*ben 5 java dynamic-class dynamic-class-creation byte-buddy
我有一个类,例如:
public class Sample{
private String a;
private String b;
public Sample(String a, String b)
{
this.a = a;
this.b = b;
}
public String getA() {return a;}
public String getB() {return b;}
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个从 Sample 类继承的动态类,并向其中添加字段(字符串字段)。
我试图做:
DynamicType.Builder<? extends Sample> classBuilder = new ByteBuddy()
.subclass(Sample.class, ConstructorStrategy.Default.NO_CONSTRUCTORS)
.name("sampleSon");
classBuilder.defineConstructor(Visibility.PUBLIC)
.withParameters(String.class, String.class, String.class)
.intercept(MethodCall.invoke(Sample.class.getConstructor(String.class, String.class))
.withArgument(0, 1)
.andThen(FieldAccessor.ofField("c").setsArgumentAt(2)));
Run Code Online (Sandbox Code Playgroud)
但是当我尝试从这个类创建一个实例时:
Class<? extends Sample> newSampleClass= classBuilder.make().load(ClassLoader.getSystemClassLoader()).getLoaded();
Sample sample = newSampleClass.getConstructor(String.class, String.class, String.class).newInstance("a", "b", "c");
Run Code Online (Sandbox Code Playgroud)
它抛出一个异常:
public class Sample{
private String a;
private String b;
public Sample(String a, String b)
{
this.a = a;
this.b = b;
}
public String getA() {return a;}
public String getB() {return b;}
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我想创建一个类,这样:
public class SampleSon extends Sample {
private String c;
public SampleSon(String a, String b, String c) {
super(a,b);
this.c = c;
}
public String getC() { return c;}
}
Run Code Online (Sandbox Code Playgroud)
c在构造函数定义中开始使用字段之前,您无需定义字段。
Class<? extends Sample> clazz = new ByteBuddy()
.subclass(Sample.class, ConstructorStrategy.Default.NO_CONSTRUCTORS)
.name("SampleSon")
.defineField("c", String.class, Visibility.PRIVATE)
.defineConstructor(Visibility.PUBLIC)
.withParameters(String.class, String.class, String.class)
.intercept(MethodCall.invoke(Sample.class.getConstructor(String.class, String.class))
.withArgument(0, 1)
.andThen(FieldAccessor.ofField("c").setsArgumentAt(2)))
.make()
.load(ClassLoader.getSystemClassLoader())
.getLoaded();
Run Code Online (Sandbox Code Playgroud)
注意:您还需要根据ByteBuddyjavadoc 链接所有方法调用。
| 归档时间: |
|
| 查看次数: |
1754 次 |
| 最近记录: |