フィールドをスーパークラスへの呼び出しでコンストラクタを定義して初期化:私は(Sampleクラスから阻害する動的なクラスを作成し、それにフィールドを追加したいバイトバディ - のような私は、クラスを持っている
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;}
}
文字列フィールド)。
私が実行しようとしました:
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)));
が、私はこのクラスからインスタンスを作成しようとしたとき:
Class<? extends Sample> newSampleClass= classBuilder.make().load(ClassLoader.getSystemClassLoader()).getLoaded();
Sample sample = newSampleClass.getConstructor(String.class, String.class, String.class).newInstance("a", "b", "c");
それが例外をスローします:
java.lang.NoSuchMethodException: sampleSon.<init>(java.lang.String, java.lang.String, java.lang.String)
私は何間違っている?あなたは、コンストラクタの定義でそれを使用し始める前に、フィールドc
を定義しない
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;}
}
回答に記載されているとおり:Byte Buddyは完全に変更できません。ライブラリ内の呼び出しを連鎖させる必要があります。 –