我想更改类的导入,以便它们指向不同的包。 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/