package private
class のデフォルト コンストラクターなどの既存のプライベート メソッドについては、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();