Перенос класса в другой загрузчик классов с помощью ByteBuddy - PullRequest
1 голос
/ 18 июня 2019

Я реализую движок, который инкапсулирует весь код, выполняемый в изолированном загрузчике классов. Я хочу создать Logback Appender, чтобы сохранить весь журнал из кода, который будет работать на моем движке.

Для этого я пытаюсь использовать ByteBuddy.

  protected void append(LoggingEvent event) {
    System.out.println(event);
  }

  @Override
  protected Class<?> findClass(String name) throws ClassNotFoundException {
    if (name.equals("io.vepo.logger.MyAppender")) {
      return new ByteBuddy().with((TypeDescription superClass) -> name)
                            .subclass(
                                TypeDescription.Generic.Builder.parameterizedType(
                                    Class.forName("ch.qos.logback.core.UnsynchronizedAppenderBase", false, this),
                                    Class.forName("ch.qos.logback.classic.spi.LoggingEvent", false, this))
                                                               .build())
                            .method(ElementMatchers.named("append"))
                            .intercept(MethodDelegation.to(this).withAssigner((source, target, typing) -> StackManipulation.Trivial.INSTANCE))
                            .make()
                            .load(this, ClassLoadingStrategy.Default.INJECTION)
                            .getLoaded();
    } else {
      return super.findClass(name);
    }
  }

Как я могу реализовать Assigner для приведения LogginEvent к моему основному загрузчику классов?

...