问题标签 [byte-buddy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2445 浏览

java - 使用 Byte Buddy for Java 代理

我希望创建一个代理来附加到我们的实时 Tomcat 和 Weblogic 服务器,它将拦截对我公司包中声明的所有类的所有方法调用,并记录一些指标,例如执行时间。

我遇到了似乎可以满足此需求的 Byte Buddy 库。但是,我不是 100% 清楚使用 Byte Buddy 创建代理的方法:

我采用了创建自己的代理的方法,并使用 Maven 将其打包,以将 Byte Buddy 包含为从我的catalina.bat.

编辑:我已经下载了源代码并发现 AgentBuilder 依赖于 byte-buddy-agent 包,因此上述问题无关紧要。

Tomcat 启动正常,我可以看到代理被调用,因为我看到了 "Entered premain" System.out

System.out但是,当我在部署到 Tomcat 的单独战争文件上执行代码时, 我从未看到“拦截” 。编辑:下面的代码根据 Rafael 的响应进行了更新,现在可以正常工作了。

有人可以告诉我我在这里可能做错了什么吗?我在下面包含了代理代码。

另外,有人能告诉我哪个ElementMatchers最适合包装匹配吗?我试过nameStartsWith了,但没有效果,API 文档没有说明它是否是完全限定的类名。

*编辑:nameStartsWith 确实检查了包。*

无论如何,提前感谢您的帮助!

0 投票
1 回答
1716 浏览

java - 使用 Byte Buddy 的检测问题

我让 Byte Buddy 作为代理启动并运行,它成功拦截了我的绝大多数代码库,顺便说一句,这相当大!虽然有一些异常值我无法检测,但我在下面记录了这些异常值,希望您能知道答案!

1.CGLIB生成类

Spring 生成了一些与我的类同名但"$$EnhancerByCGLIB$$"附加到末尾的附加类,这些会导致错误。我得到的错误是:

事实上,我对检测 CGLIB 生成的类没有兴趣,因此希望排除这些。最好的方法是什么?目前,我按名称匹配,但我想知道这是否是最好的方法。

2.打包私有和私有类

我看到的另一个问题是检测 apackage privateprivate class.

Package private代码如下所示:

我得到的错误是:

Private class代码如下所示:

我得到的错误是:

可以字节好友仪器package privateprivate classes

3.沉默失败

这只是一个一般性问题,但是否可以指示 Byte Buddy 在每个课程中静默失败?这样一来,任何此类错误都不会阻止应用程序启动或 Byte Buddy 尽可能多地检测。

4.公共抽象类中的公共方法

我的代码是这样的:

这会在检测 BaseBeanB 时导致以下错误:

java.lang.IllegalArgumentException:[受保护的 void java.lang.Object.finalize() 均不抛出 java.lang.Throwable,public final 本机 void java.lang.Object.wait(long) 抛出 java.lang.InterruptedException,public final void java.lang.Object.wait() throws java.lang.InterruptedException, public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java .lang.Object), public java.lang.String java.lang.Object.toString(), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass (), protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException, public final native void java.lang.Object.notify(), public final native void java.lang.Object。 notifyAll(),公共 java.lang。Object com.mycompany.MyInterceptor.intercept(java.util.concurrent.Callable,java.lang.Object[],java.lang.reflect.Method,java.lang.Class) throws java.lang.Exception] 允许从公共抽象对象 com.mycompany.InterfaceA.provideAccess(java.lang.String)

0 投票
1 回答
476 浏览

java - 方法被拦截了两次,即使它被调用了一次

在下面的代码片段中,我doStuffSubclass. 然而,它被拦截了两次。

注意doStuff是在父类中定义的SuperClass。如果doStuff在拦截逻辑中定义SubClass将按预期工作:只有一次拦截。

我是否错误地使用了字节好友?

0 投票
1 回答
801 浏览

java - 使用 MethodDelegation 实现环绕建议

我对这里描述的方法委托很感兴趣:

http://www.javacodegeeks.com/2015/01/make-agents-not-frameworks.html

这很好用:

我可以拦截调用并捕获传递给方法的参数,这是我想要实现的一半。但是,我还没有找到一种同样简洁的方法来捕获返回值。我知道我可以将 Callable 传递给执行调用的拦截器,但是沿着这条路走下去似乎是弄乱我的堆栈跟踪的可靠方法。

在我看来,应该有一种简单且规范的方式来实现“环绕方法”模式。

在我开始深入研究实数 API 之前:我错过了什么吗?

0 投票
1 回答
3092 浏览

java - ByteBuddy IllegalStateException:附件提供程序无法在当前 JVM 上连接

我正在尝试模拟一个由某个进程加载以返回另一个值的类。

说我有

我希望如果某些进程调用ClassA.getTheClass()返回ClassC(当然实现IClassType

不知何故,我发现这应该可以通过 Byte Buddy 的热交换功能实现。但我无法安装代理。我尝试使用-javaagent:C:\byte-buddy-agent-0.7.1.jar给我的开关

以及ByteBuddyAgent.install();产生

在我的机器上。这仅适用于 OpenJDK 吗?我错过了什么吗?

0 投票
1 回答
1564 浏览

java - 使用 Byte Buddy 拦截对 Java 8 lambda 表达式的调用

我尝试使用 Byte Buddy 拦截对方法的调用和对 Java 8 lambda 表达式的调用,AgentBuilder如下所示:

我正在使用字节好友 v0.7.1。

它可以拦截以下Runnable(匿名类):

当然还有对定义为普通(非匿名)类的对象的任何调用。但拦截不适用于 lambda 表达式,例如:

我怎样才能拦截 lambda 表达式调用?据我所知,Byte Buddy 中没有LambdaInterceptor这样的东西。

0 投票
1 回答
747 浏览

java - 使用 Byte Buddy 拦截对我的 Java 和 Groovy 代码的方法调用:奇怪的 java.lang.VerifyError

我尝试使用 Byte Buddy 0.7.1 拦截对来自混合 Java (8) 和 Groovy (2.4.5) 项目的类方法的调用。

这个想法是为特定包中的类的方法调用及其参数(如foo.

我使用 Byte BuddyAgentBuilder和我的自定义LogInterceptor在应用程序启动时执行此操作:

方法拦截适用于所有 Java 类。它适用于所有带有@CompileStatic注释的 Groovy 类。

但是对于带有奇怪java.lang.VerifyErrors的经典(动态)Groovy 类,它会失败

这里发生了什么?Byte Buddy 是否支持 Groovy 方法拦截?

0 投票
1 回答
1577 浏览

java - 如何拦截构造函数

我想拦截所有用@Inject 注释的方法。下面的测试表明它适用于方法,但不适用于构造函数。我错过了什么?

我尝试添加一个自定义方法匹配器,但我注意到我从未获得与构造函数对应的 MethodDescription。

输出:

0 投票
1 回答
332 浏览

java - 对构造函数的拦截导致 ClassNotFoundException

我正在尝试拦截带有注释的构造函数@Inject。这在小型单元测试的情况下工作得很好。然而,在像 Spring 这样的 DI 容器的上下文中,它会以ClassNotFoundException.

我设法缩小了根本原因。调用getDeclaredConstructors检测类将触发此异常。有趣的是,如果我们首先创建该类的实例,问题就消失了。

例如:

堆栈堆栈跟踪可以找到: http: //pastebin.com/1zhx3fVX

0 投票
1 回答
945 浏览

java - 构造函数拦截器之后和之前

我知道如何创建一个 BEFORE 构造函数拦截器:

我知道如何创建一个 AFTER 构造函数拦截器:

使用以下拦截器:

但是我不知道如何创建一个之前/之后的拦截器。这是我尝试过的(基于已经适用于方法的天真方法):

使用此方法委托:

通过此设置,我得到:

完整的堆栈跟踪: