1

对于现有的私有方法,例如类的package private默认构造函数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 回答