1

package privateclass のデフォルト コンストラクターなどの既存のプライベート メソッドについては、ContentItem以下のコードを使用してメソッドを保護するように設定しました。

以下のコードとByte BuddyのテストケースAbstractDynamicTypeBuilderForInliningTest.java::testMethodTransformationExistingMethod()をテストすることにより、ファイルにロードdynamicTypeまたは保存すると、ロードされたクラスと保存されたクラスのデフォルトのコンストラクターは になりましprotectedたが、コンストラクターdynamicType.getTypeDescription().getDeclaredMethods()は元の修飾子 ig 0 (パッケージプライベート) を保持していることがわかりました.

問題は、変換されたクラス情報をロードまたは保存せずに取得するにはどうすればよいかということです。変換されたクラス情報を使用して、クラスのサブクラスにデフォルト コンストラクターを追加するContentItem必要があります (サブクラスのデフォルト コンストラクターは、のデフォルト コンストラクターを呼び出す必要がありContentItemます)。

public class ContentItem {
    ContentItem() {}

    private ContentItem(UIDBasedID uid, String archetypeNodeId, DvText name, Archetyped archetypeDetails, FeederAudit feederAudit, Set<Link> links, Pathable parent) {
        ......;
    }

Class<?> clazz = ContentItem.class;
DynamicType.Unloaded<?> dynamicType = ByteBuddy().redefine(clazz)
    .constructor(takesArguments((List<TypeDescription>) (List) Collections.EMPTY_LIST))
    .intercept(MethodCall.invoke(clazz.getSuperclass().getDeclaredConstructor()))
    .transform(MethodTransformer.Simple.withModifiers(Visibility.PROTECTED))
    .make();
TypeDescription typeDescription = dynamicType.getTypeDescription();
dynamicType.saveIn(...);
Class<?> tmpType = dynamicType.load(...).getLoaded();
4

1 に答える 1

0

提供された型の説明には、パフォーマンス上の理由から、スーパー クラスのオーバーライドされたメソッドまたは変換されたメソッドは含まれていません。

完全に変換された型を読み取りたい場合は、バイト配列を再解析する必要があります。バイトを解釈する型プールにバイト配列を提供するだけです。

于 2016-06-04T22:39:43.970 に答える