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

使用不带-javaagent参数的ByteBuddy Java代理

徐奇
2023-03-14

我正在尝试在项目中检测一些类。当我将代理类打包到jar中并通过-javaagent使用它时,它工作正常。

public static void premain(String arguments, Instrumentation instrumentation) {

        new AgentBuilder.Default()
                .type(ElementMatchers.nameStartsWith("com.cn."))
                .transform((builder, type, cl, m) -> builder
                        .method(ElementMatchers.isAnnotatedWith(Retryable.class))
                        .intercept(to(Retry.class)))
                .installOn(instrumentation);
    }

当我尝试直接在项目中运行它时,检测有时会失败。(我在测试类的静态块中初始化bytepal)。

    static {
        Instrumentation inst = ByteBuddyAgent.install();

        new AgentBuilder.Default()
                .type(ElementMatchers.nameStartsWith("com.cn."))
                .transform((builder, type, cl, m) -> builder
                        .method(ElementMatchers.isAnnotatedWith(Retryable.class))
                        .intercept(to(Retry.class)))
                .installOn(inst);
    }

例如,当我添加这个测试时,我的代码不再被截获。用try/catch做同样的事情是有效的。

RuntimeException e = Assertions.assertThrows(RuntimeException.class, () -> f.doit("doit foo"));

有没有一种安全的方法来仪器类在同一个项目没有-javaagent?

项目在OpenJdk11上。

共有1个答案

支阳波
2023-03-14

使用-javaagent选项,您将始终确保在安装代理后加载您的类。

如果在静态块中安装代理,则必须确保在加载任何要插入工具的类之前执行这段代码。您可以将代理安装在主方法中,也可以安装在主方法所在的静态块中。

 类似资料:
  • 我问题的根源是,我试图使用部署在JBoss AS7上的web应用程序中的SizeOf sourceforge项目,并为获取。我添加了添加到服务器的从我的servlet的doGet方法中,应用程序失败,出现前面提到的<code>ClassNotFoundException</code>。 如果有人能告诉我如何让它与 JBoss AS7 一起工作,那将是有帮助的(我让它在 Eclipse 运行配置中工

  • 我在AmazonRDS上使用PostResql9.3w/PostGIS 2.1.8。我有一个名为project_location的表,它定义了“地理Geofence”(每个Geofence本质上都是一个坐标和半径)。地理Geofence使用名为“位置”的几何图形列和名为“半径”的双列存储。我在location列上有一个空间索引。 该表目前约有50,000条记录。如果我查询表格来查找地理Geofen

  • 基本上,eclipse导出javadoc输出格式如下: 如果我想另一种格式,如: (没有包名称) 在EclipseJavadoc额外javadoc选项项中我应该做什么?非常感谢。

  • 是否有可能将方法引用与参数一起使用?我喜欢流的想法,我只是想让代码更易读。 实际上,我认为有一个类似的问题,方法引用了一个参数,我读了,但不知道如何在我的代码中使用bind2方法。这是唯一的解决办法吗?

  • 我有一个这样的可重装武器类: 具有以下: 并像这样使用它: 客户: 我想知道,对于命令,对于我看到的示例,除了命令正在操作的对象之外,没有其他。 此示例更改执行方法以允许使用参数。 另一个示例,更接近我在这里拥有的,在构造函数中使用参数。 在命令中包含参数是不是不好的做法/代码气味,在这种情况下是带有项目符号数的?

  • 对于我的Java应用程序,我尝试使用ScalaCheck编写一些基于属性的单元测试。为此,我需要生成器,但我能找到的所有教程都使用带有参数的构造函数来生成对象。我需要生成的对象没有构造函数参数,我无法添加这样的构造函数,因为它来自外部库。 我现在有以下内容(Jwt声明来自软件包组织.jose4j.jwt): 关于如何编写我的生成器,有什么建议吗?我对Scala一无所知,所以如果我犯了一个“明显”的