I'd like to change the imports of a class so that they point to a different package. Byte Buddy docs don't give much info on how one can achieve this. This is what I have so far:
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;
}
}
My goal is to change some package prefix names so that they have ".proxy" appended to them. Note that I only need to change method signatures since the targets are interfaces.
I found a solution. Turns out Byte Buddy has a convenience class called ClassRemapper to achieve exactly what I want:
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;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With