2016-06-03 16 views
1

Für eine vorhandene private Methode, z. B. einen package private Standardkonstruktor einer Klasse ContentItem, habe ich unten Code verwendet, um die zu schützende Methode festzulegen.Nach der Transformation von Byte Buddy, wie Klasseninformationen erhalten, ohne Klasse zu laden oder zu speichern?

von Testcode unten und Byte Buddys Testfall AbstractDynamicTypeBuilderForInliningTest.java::testMethodTransformationExistingMethod(), fand ich, dass, wenn ich dynamicType laden oder in der Datei speichern, der Standardkonstruktor der geladenen Klasse und die gespeicherte Klasse protected worden sind, aber der Konstruktor in dynamicType.getTypeDescription().getDeclaredMethods() hält noch original Modifikator, ig 0 (Paket privat).

Die Frage ist also, wie kann ich die transformierten Klasseninformationen erhalten, ohne sie zu laden oder zu speichern? Ich muss die transformierte Klasseninfo verwenden, um den Standardkonstruktor in die Unterklassen der Klasse ContentItem einzufügen (der Standardkonstruktor der Unterklassen muss den Standardkonstruktor ContentItem aufrufen).

Antwort

0

Die angegebene Typbeschreibung enthält aus Leistungsgründen keine überschriebenen Methoden von Superklassen oder transformierten Methoden.

Sie müssen das Byte-Array analysieren, wenn Sie den vollständig transformierten Typ lesen möchten. Stellen Sie das Byte-Array einfach einem Typ-Pool zur Verfügung, der die Bytes interpretiert.

+0

Ja, es funktioniert gut mit 'TypeDescription typeDescription = TypePool.Default.of (new ClassFileLocator.ForFolder (neue Datei (destClassFilePath))). Describe (clazz.getName()). Resolve();'. Eine weitere Frage, ich möchte Modifizierer des vorhandenen Standardkonstruktors nur ändern, ohne den Methodenkörper zu ändern, wie ändere ich den 'intercept (...)' im Code '.... intercept (MethodCall.invoke (clazz.getSuperclass() .getDeclaredConstructor())) .transform (MethodTransformer.Simple.withModifiers (Visibility.PROTECTED)) 'um es zu erreichen? –

+0

Stellen Sie einfach einen Matcher isConstructor() und (takesArguments (0)) für den Transformator und den Interceptor bereit. –

+0

Sorry, vielleicht habe ich meine "weitere Frage" nicht eindeutig beschrieben. Wiederholen wir es. Angenommen, der ursprüngliche private Standardkonstruktor hat den Text "{this.someArray = new ArrayList (...);}". Ich möchte den Modifikator des Standardkonstruktors ändern, aber weiterhin seinen ursprünglichen Körper verwenden. Ich wünschte, ich kann 'ByteBuddy() ausführen. Redefinieren (clazz) .constructor (isDefaultConstructor()). Transform (MethodTransformer.Simple.withModifiers (Visibility.PROTECTED))', aber ich kann nicht, weil die Schnittstelle von 'Konstruktor (. ..) 'hat keine Methode' transform (...) '.