首页 > 解决方案 > 如何使用字节伙伴实现 ClassFileTransformer#transform?

问题描述

有没有办法使用字节伙伴来实现 ClassFileTransformer#transform?目前我的实现使用 javassist 但我想用字节伙伴替换它,因为它有更好的泛型支持。

到目前为止,我的实现如下所示:

public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
  ProtectionDomain protectionDomain, byte[] classfileBuffer)
{
  if (className.startsWith("my.package."))
  {
    try {
      final CtClass ctClass = classPool.makeClass(new ByteArrayInputStream(classfileBuffer));
      /* class manipulation */
      return ctClass.toBytecode();

      // remove class from class pool if it hasn't been modified
      ctClass.detach();
    } catch(final Exception ex) {
      logger.error("failed to analyse/transform class {}", className, ex);
    }
  }

  return classfileBuffer;
}

字节伙伴可能有类似的事情吗?有没有办法使用参数 classfileBuffer 中提供的字节码来提供字节伙伴?

ClassFileTransformer 实现被配置到 Spring Load Time Weaver 中。所以我已经有了可用的“基础设施”。因此我宁愿不安装另一个字节伙伴代理来解决这个问题。

标签: byte-buddy

解决方案


是的,请查看 AgentBuilder.Default。它提供了一个用于实现 Java 代理的 DSL。您不需要使用它来实现自己的类文件转换器,只需指定要进行的转换即可。


推荐阅读