java - 如何使用 Byte Buddy 更改导入?

标签 java byte-buddy

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

 
public class ProxyPlugin implements net.bytebuddy.build.Plugin {
    public DynamicType.Builder apply(DynamicType.Builder builder, TypeDescription typeDescription) {
        return builder.name(typeDescription.getPackage().getName() + ".proxy."  + typeDescription.getSimpleName());

    }

    public boolean matches(TypeDescription typeDefinitions) {
        return true;
    }
}

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

最佳答案

我找到了一个解决方案。原来 Byte Buddy 有一个名为 ClassRemapper 的便利类来实现我想要的:

public class ProxyPlugin implements net.bytebuddy.build.Plugin {
    public DynamicType.Builder apply(DynamicType.Builder builder, TypeDescription typeDescription) {
        DynamicType.Builder proxy = builder.name(typeDescription.getPackage().getName() + ".proxy." + typeDescription.getSimpleName());

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

            public int mergeReader(int flags) {
                return 0;
            }

            public ClassVisitor wrap(TypeDescription instrumentedType, ClassVisitor classVisitor, int writerFlags, int readerFlags) {
                return new ClassRemapper(classVisitor, new Remapper() {
                    @Override
                    public String map(String typeName) {
                         if (typeName.startsWith("org/example/api") && !typeName.contains("/proxy/")) {
                            return typeName.substring(0, typeName.lastIndexOf("/") + 1) + "proxy" + typeName.substring(typeName.lastIndexOf("/"));
                        } else {
                            return typeName;
                        }
                    }
                });
            }
        });

        return proxy;
    }

    public boolean matches(TypeDescription typeDescription) {
        return true;
    }
}

关于java - 如何使用 Byte Buddy 更改导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39742821/

相关文章:

java - ByteBuddy : java. lang.IllegalArgumentException:无法附加 undefined variable :V

java - 使用处理程序将重复任务延迟有限次数

java - 在字节好友中生成参数注解

java - 在 Byte Buddy 中动态设置 @FieldProxy 字段

android - 之后字节好友会删除Android存储中生成的类文件吗?

java - 在 Java 8 中将匿名内部方法转换为 Lambda

java - 给java类赋值,但不返回值

java - 如何检查 netbeans 中的编译器和运行时?

java - println 覆盖第一个参数

java - 在 ByteBuddy rebase 期间拦截构造函数