2016-09-28 79 views
1

我想改变一个类的导入,以便它们指向一个不同的包。 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”追加到它们。请注意,我只需要更改方法签名,因为目标是接口。

回答

1

我找到了解决方案。原来字节好友呼吁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; 
    } 
} 
+1

这是这样做,但请注意,这是使用底层API ASM的正确途径。最后,在字节码中没有像导入这样的东西,你只是用另一种类型替换一种类型。您有责任确保程序的正确性。 –

相关问题