를 초기화 : 나는 샘플 클래스에서 억제하고, (여기에 필드를 추가하는 동적 클래스를 만들바이트 버디 - 슈퍼 클래스 호출 생성자를 정의하고 내가 같은 클래스가 필드를
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는 완전히 변경할 수 없습니다. 라이브러리의 모든 호출을 연결해야합니다. –