当前位置: 首页 > 知识库问答 >
问题:

指定用于加载通知依赖项的依赖项的类加载器

丰胤运
2023-03-14

我有一个Advision类,它使用了代理jar中的另一个类,但这个类依赖于代理jar中不存在的一个类。代理jar中不存在的这个类存在于应用程序类加载器上的另一个jar中。代理jar位于系统类加载器上。所以我没有遇到ClassDefounderRor。我已经尝试使用Transformer.forAdvise,这是在另一篇文章中建议的,但这只适用于Advise类。

// In agent jar on system class loader
MyAdviceClass {
  @Advice.OnMethodEnter
  public static void onMethodEnter() {
    YetAnotherClass.doSomething(); // works fine as Transformer.ForAdvice makes use of the correct class loader while inlining this code
    AnotherClass.doSomething(); // NoClassDefFoundError happens inside this method call
  }
}

// In agent jar on system class loader
public class AnotherClass {
  public static void doSomething() {
    YetAnotherClass.doSomething();  // NoClassDefFoundError happens here because the system class loader is used to load YetAnotherClass, but that class is only present on the application class loader
  }
}

// In user jar on application class loader
public class YetAnotherClass {
  public static void doSomething() {
    // do something else
  }
}
.transform(new AgentBuilder.Transformer
                           .ForAdvice()
                           .include(getClass().getClassLoader())
                           .advice(methodMatcher, "com.something.advice.MyAdvice.class"));

共有1个答案

锺离昂然
2023-03-14

我假设另一个类在被检测的类中是不可见的。在这种情况下,您不应该将该类包含在ypur代理jar中,而是将其放置在通过Instrumentation.AppendToBootSearchPath追加到引导加载程序的seperate jar中。引导加载程序上的类是普遍可见的,因此您的检测类应该可以访问这些类。

但是,如果注入的类引用了检测类加载器的类,则可能需要使用ClassInjector将类注入到类加载器中。

 类似资料:
  • 问题内容: 我一直在尝试建立一个自定义的类加载器,该类加载器将拦截类以打印出哪些类正在加载到应用程序中。类加载器看起来像这样 它只是吐出它加载的所有类的名称。但是,当我尝试运行一些代码时, 通过 它打印出来 这似乎很奇怪。这不是一个简单的类,它取决于程序包中的许多其他类。这些类显然正在加载中,因为d python代码能够执行操作并读取我的文件。但是,由于某些原因,那些类并未由load的类加载器加载

  • 问题内容: 假设我想在项目中添加guice-assistedinject作为依赖项。它将guice工件指定为依赖项本身。如何告诉它使用guice的no_aop版本? 我知道我可以执行以下操作,但是我可以一步完成而不排除guice模块吗? 问题答案: 没有更简单的解决方案。您可以使用简短的依赖性表示法(例如)来缩短代码。

  • 我需要上传文件: 我有错误: 2017-04-11 23:22:37.416错误---[Thread-12]grails。靴子GrailsApp:编译错误:启动失败:类生成期间的常规错误:java。lang.NoClassDefFoundError:无法加载类org。springframework。网状物多部分。平民CommonsMultipartFile由于缺少依赖项Lorg/apache/co

  • 如何从其 GitHub 存储库(该库使用 Maven 作为构建系统)添加 Java 库作为依赖项添加到我的 Maven 项目中?我可以在不下载和编译库的情况下执行此操作吗?

  • 问题内容: 当我输入command go build时,我有一个项目具有来自bitbucket上私人存储库的多个依赖项。我得到这个错误 无法识别的导入路径“ bitbucket.xxx.xx / xx / x” x509:证书由未知授权机构签名 我已经尝试了几种方法,例如添加令牌 git config –global http.extraheader令牌 配置为ssh git config –gl