Ich schrieb dieses Beispiel:Wie können wir auf Methoden zugreifen, die von ByteBuddy zur Kompilierungszeit generiert wurden?
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();
}
Und ich möchte es verwenden, um die neu definierten number
atributte zu erhalten:
Integer num = someCreateMethod(EntityExample.class).getNumber(); //(1)
Oder das neu definierte stringVal
Attribut zu erhalten:
String sVal = someCreateMethod(EntityExample.class).getStringVal(); //(2)
Mein Problem ist, dass (1) ganz gut funktioniert, während (2) nicht funktioniert. Ich erhalte den folgenden Fehler:
Error:(40, 67) java: cannot find symbol
symbol: method getStringVal()
Auch ist es möglich, so etwas wie dies mit einer dynamisch generierte Klasse zu tun:
NewEntity newEntity = someCreateMethod(EntityExample.class);
Integer num = newEntity.getNumber();
String sVal = newEntity.getStringVal();
?
EDIT: Ich schätze Ihre Hilfe, dieses Beispiel war mein erster Versuch mit der ByteBuddy-Bibliothek. Ich dachte, dass defineMethod
tatsächlich eine Implementierung einer Interface-Methode definiert, nicht nur eine zufällige Methode zu der Klasse hinzufügen. Also habe ich beschlossen, hier zu erklären, was genau ich erreichen möchte.
Für jedes Date
Attribut in einer Klasse E, möchte ich zwei weitere Felder hinzuzufügen (und ihre Entsprechungen Getter und Setter), die (atribute name)InitialDate
und (atribute name)FinalDate
, sagen lassen, so dass ich Intervalle functinality für jedes Datum in E
verwenden können.
Ich fragte mich, ob ich Code-Generierung verwenden könnte, um diese Methoden hinzuzufügen, ohne für jede E
Subklassen erstellen zu müssen.
PS: E
kann nicht geändert werden, es gehört zu einem Legacy-Modul.
PS2: Ich weiß nicht, wie viel Datum Attribute gibt es in jedem Unternehmen sein würde E
, aber das neue attibutes und Methoden würden Konventionen erstellt werden (zB __FisrtDay
, __LastDay
), wie unten gezeigt:
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: Ist das, was ich versuche, mit ByteBuddy oder überhaupt überhaupt möglich? Gibt es eine andere Art und Weise?
PS4: Sollte mein EDIT eine neue Frage gewesen sein?
Ich gehe davon aus, dass 'getNumber' in der' EntityExample' Schnittstelle definiert ist, wo 'getStringVal' nicht ist. –
Verzeihen Sie auch die dumme Frage meinerseits ... aber warum denken Sie, dass Sie das tun wollen? –
@Joe C Nun, ByteBuddy lässt uns neue Methoden definieren, oder? (seit dem ".defineMethod" -Teil) Ich denke, es sollte uns einen Weg geben, auf die Methoden zuzugreifen, die wir erschaffen ... Ich weiß einfach nicht, wie ich es machen soll. Wie für Ihren zweiten Kommentar muss ich dynamisch Unterklassen jeder Klasse erstellen, die ich als Parameter an die Methode "someCreateMethod" übergeben, und diese Unterklassen sollten zwei neue Methoden implementieren. Deshalb will ich das. –