【问题标题】:How do you change imports with Byte Buddy?您如何使用 Byte Buddy 更改导入?
【发布时间】:2016-09-28 09:08:30
【问题描述】:

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

公共类 ProxyPlugin 实现 net.bytebuddy.build.Plugin { 公共 DynamicType.Builder 应用(DynamicType.Builder 构建器,TypeDescription typeDescription){ 返回 builder.name(typeDescription.getPackage().getName() + ".proxy." + typeDescription.getSimpleName()); } 公共布尔匹配(TypeDescription typeDefinitions){ 返回真; } }

我的目标是更改 一些 包前缀名称,以便它们附加“.proxy”。请注意,我只需要更改方法签名,因为目标是接口。

【问题讨论】:

    标签: java byte-buddy


    【解决方案1】:

    我找到了解决方案。原来 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.visit(新 AsmVisitorWrapper() { 公共 int mergeWriter(int flags) { 返回0; } 公共 int mergeReader(int flags) { 返回0; } 公共 ClassVisitor 包装(TypeDescription InstrumentedType,ClassVisitor classVisitor,int writerFlags,int readerFlags){ return new ClassRemapper(classVisitor, new Remapper() { @Override 公共字符串映射(字符串类型名称){ if (typeName.startsWith("org/example/api") && !typeName.contains("/proxy/")) { 返回 typeName.substring(0, typeName.lastIndexOf("/") + 1) + "proxy" + typeName.substring(typeName.lastIndexOf("/")); } 别的 { 返回类型名; } } }); } }); 返回代理; } 公共布尔匹配(TypeDescription typeDescription){ 返回真; } }

    【讨论】:

    • 这是正确的做法,但请注意这是使用底层 ASM API。最后,字节码中没有导入之类的东西,您只是将一种类型替换为另一种类型。您有责任确保程序的正确性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多