对于现有的私有方法,例如类的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();