我想更改类的导入,以便它们指向不同的包。 Byte Buddy文档没有提供太多有关如何实现此目标的信息。这是我到目前为止所拥有的:

 
公共类ProxyPlugin实现net.bytebuddy.build.Plugin {
    public DynamicType.Builder apply(DynamicType.Builder builder,TypeDescription typeDescription){
        返回builder.name(typeDescription.getPackage()。getName()+“ .proxy。” + typeDescription.getSimpleName());

    }

    公共布尔匹配项(TypeDescription typeDefinitions){
        返回true;
    }
}


我的目标是更改某些程序包前缀名称,以使它们后面带有“ .proxy”。请注意,由于目标是接口,因此我只需要更改方法签名。

最佳答案

我找到了解决方案。事实证明,Byte Buddy具有一个名为ClassRemapper的便利类,可以实现我想要的功能:

公共类ProxyPlugin实现net.bytebuddy.build.Plugin {
    public DynamicType.Builder apply(DynamicType.Builder builder,TypeDescription typeDescription){
        DynamicType.Builder代理= builder.name(typeDescription.getPackage()。getName()+“ .proxy。” + typeDescription.getSimpleName());

        proxy = proxy.visit(new AsmVisitorWrapper(){
            public int mergeWriter(int flags){
                返回0;
            }

            public int mergeReader(int flags){
                返回0;
            }

            公共ClassVisitor wrap(TypeDescription instrumentedType,ClassVisitor classVisitor,int writerFlags,int readerFlags){
                返回新的ClassRemapper(classVisitor,新的Remapper(){
                    @Override
                    public String map(String typeName){
                         如果(typeName.startsWith(“ org / example / api”)&&!typeName.contains(“ / proxy /”)){
                            返回typeName.substring(0,typeName.lastIndexOf(“ /”)+ 1)+“ proxy” + typeName.substring(typeName.lastIndexOf(“ /”)));
                        }其他{
                            返回typeName;
                        }
                    }
                });
            }
        });

        返回代理;
    }

    公共布尔匹配项(TypeDescription typeDescription){
        返回true;
    }
}

10-05 23:32