Как реализовать преобразование ClassFileTransformer # с помощью байта? - PullRequest
0 голосов
/ 20 мая 2019

Есть ли способ использовать байтовый компаньон для реализации преобразования ClassFileTransformer #? На данный момент моя реализация использует javassist, но я хочу заменить его на bute buddy, поскольку он имеет улучшенную поддержку обобщений.

Пока моя реализация выглядит так:

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 сконфигурирована в Weaver Spring Load Time Weaver. Так что у меня уже есть «инфраструктура». Поэтому я бы не стал устанавливать другой агент для байтового партнера для решения этой проблемы.

1 Ответ

0 голосов
/ 20 мая 2019

Да, посмотрите на AgentBuilder.Default.Он предлагает DSL для реализации агентов Java.Вам не нужно реализовывать свой собственный преобразователь файлов классов, используя его, просто укажите преобразования, которые вы хотите сделать.

...