用ByteBuddy将类包装到另一个类加载器

时间:2019-06-18 13:39:18

标签: java java-8 classloader byte-buddy bytecode-manipulation

我正在实现一个引擎,该引擎封装了在隔离的类加载器中执行的所有代码。我想创建一个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转换为我的主类加载器?

0 个答案:

没有答案