问题标签 [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 回答
403 浏览

java - 在运行时更改类的超类

我可以使用 Byte Buddy 通过从抽象类继承来在运行时增强类吗?

我应该能够Organization通过从下面的抽象类继承来拦截并增强它的所有实例。

0 投票
1 回答
468 浏览

java - 尝试重新定义 sun.reflect.GeneratedMethodAccessor1 时,ByteBuddy 失败

出于好奇,我尝试导出 GeneratedMethodAccessor1 的字节码(使用反射时由 JVM 生成)。

我尝试通过以下方式获取类的字节码:

但是,执行此类时出现以下错误:

基本上,我首先在方法调用上迭代足够多次,让 JVM 膨胀方法(生成 GeneratedMethodAccessor),然后尝试重新定义类以获取字节码。

我尝试了相同的方法来导出生成的代理类,它完美地工作。这就是驱使我尝试这个的原因。

当我尝试使用 loadClass 方法加载类时,似乎 GeneratedMethodAccessor1 类的 DelegatingClassLoader 甚至无法重新加载该类。

有什么想法可以检索 GeneratedMethodAccessor 类的字节码吗?

0 投票
1 回答
694 浏览

java - 使用 Byte Buddy 创建自定义方法签名的高效方法

我正在尝试使用 ByteBuddy 实现 Profiler。我目前正在努力有效地创建我正在分析的方法的正确签名。

这是我当前实现的要点:https ://gist.github.com/felixbarny/e0c64819c59368a28200

ProfilingInterceptor.profile 方法有两种实现。每个人都有自己的缺陷。

第一个@Origin String signature用作签名。这是非常有效的,因为 ByteBuddy 似乎缓存了它。问题是,我对签名的格式不满意。例如method2(I)I.

在第二个实现中,我注入@Origin(cacheMethod = true) Method method并手动构建了一个更好看的签名:int org.stagemonitor.benchmark.profiler.ClassJavassistProfiled.method2(int). 明显的问题是每次调用都会重新创建签名 - 不是高性能的(我的 jmh 基准测试说它慢了 4 倍)。

有没有办法缓存签名,例如为每个签名创建一个字符串常量?

提前致谢

0 投票
1 回答
1484 浏览

java - Byte Buddy - 与 ByteBuddyAgent 的 HotSwap

我正在尝试使用 byte buddy 的 HotSwap 功能。不幸的是,我收到了一些错误。我已阅读官方网站上的文档,并且我知道它仅在程序使用 Java 代理时才有效。我试图将 -javaagent 参数放在 Java 虚拟机的启动上,如下所示:

-javaagent:C:\lib\byte-buddy-agent-0.5.6.jar

这在启动我的应用程序时会产生以下错误:

尽管如此,我还是尝试使用该ByteBuddyAgent.installOnOpenJDK()方法而不是 -javaagent 参数,希望能够解决问题。但这会引发以下错误,这取决于我认为的相同问题:

有谁知道问题出在哪里,或者我误解了教程中的内容?顺便说一句,我使用 jdk1.7.0_55 和 jdk1.8.0_40 进行了尝试,并使用了 netbeans 作为 ide。我使用的字节伙伴版本是 v0.5.6。感谢您的帮助。

编辑:

-javaagent 参数的错误似乎是当前版本中的一个错误,感谢Rafael Winterhalter的快速响应。

我还弄清楚了该ByteBuddyAgent.installOnOpenJDK()方法有什么问题。从我的角度来看,这是一个非常愚蠢的错误。看来我的netbeans使用较旧的java版本作为jdk1.8.0_40,所以我更改了netbeans etc文件夹中文件中的netbeans_jdkhome变量。netbeans.conf现在我的 netbeans 使用与我的项目相同的 java 版本,即使使用 JavaFX 应用程序,它似乎也能像魅力一样工作。唯一奇怪的是,这个错误只发生在 JavaFX 应用程序中,在普通的 Java 应用程序中我从来没有遇到过这个问题。仅供参考:这是我的 JavaFX 应用程序的代码示例:

0 投票
2 回答
1506 浏览

java - 仅将字节伙伴方法委托绑定到带有注释参数的方法

我想装饰现有对象,以便自动验证方法调用。我已经设法将方法调用委托给调用 Hibernate 验证器的拦截器,到目前为止它工作正常:

我想改进的是仅将方法调用绑定到具有至少一个使用约束注释注释的参数的方法,例如:

我如何在 Byte Buddy 中指定一个 ElementMatcher,以便它只绑定到带有用 @Constraint 注释的注释注释的参数的方法,例如 @NotNull(取自 javax.validation.constraints):

0 投票
1 回答
132 浏览

java - 如何使用注释格式化 getBirthday() @MyFormat("%td.%

如何生成一个类,该类接受一个 Person 实例并将生日作为字符串返回,而不是使用 @MyFormat 注释的值格式化的日期,而无需手动编写该子类?

目的是使用生成的实例来生成 HTML 页面

我有这个(见下文)。

返回类型从 Date 更改为 String 并不重要,因为调用是通过评估表达式“person.birthday”的反射进行的。

因此,新类将具有相同的方法名称“String getBirthday()”,但使用 String 作为返回值。


我不完全确定我是否理解你试图完成的事情。以下代码正在创建一个Person您不使用的子类:

当您在运行时使用此生成的子类时,调用该getBirthday方法会导致 a值无法强制转换为ClassCastExceptiona 。Byte Buddy 不会更改返回类型,即使在通过反射调用方法时也是如此。StringDate

0 投票
1 回答
256 浏览

java - 字节伙伴代码生成

我有一个豆类

和验证实用程序:

我想生成一个如下所示的验证器 -

哪些字段是强制性的,哪些值不能超过特定数量,将在运行时查看 bean 类来决定。

我如何使用 Byte Buddy 做到这一点?

0 投票
1 回答
614 浏览

java - 如何使用 byte buddy 创建延迟加载类?

我们有一个大类(100 多个方法),它有一个用延迟加载指南注释的接口。最初加载此对象并将其发送到客户端时,我们会对最常用和最近的数据进行有限加载。我们目前正在使用 java Proxying 来嗅探每个调用。在每次调用时,我们都会检查“我们有数据吗?如果有日期参数,我们是否加载了该日期的数据?” 如果这些问题的答案是否定的,我们将返回服务器并加载完整的对象。

然而,这是可行的,Java 反射、代理和调用(getId()例如基本 getter)的额外开销会对我们的某些代码的性能造成严重破坏。

我想开始使用 byte buddy 来减少调用成本,尤其是在总是加载的简单字段上。

解决这个问题的最佳方法是什么?

此外,因为这个对象正在被序列化(Java 序列化,服务器生成这些对象并将它们交给客户端),确保这些动态创建的类可以通过网络从服务器传递到客户端的正确方法是什么?

0 投票
1 回答
1495 浏览

java - Android : load(getClass().getClassLoader(),classLoadingStrategy) 抛出 java.lang.IllegalStateException

我试图在 Android 中的方法 proxy(...) 下创建 byteBuddy 对象,然后在 byteBuddy 对象上调用一些方法:

但符合:

ByteBuddy 抛出异常:

java:781) 06-11 21:29:23.371 12028-12028/com.example.AndroidOverlay W/System.err﹕在 java.lang.BootClassLoader.loadClass(ClassLoader.java:841) 06-11 21:29:23.371 12028-12028/com.example.AndroidOverlay W/System.err:在 java.lang.ClassLoader.loadClass(ClassLoader.java:504) 06-11 21:29:23.371 12028-12028/com.example.AndroidOverlay W/System .err: ... 25 更多 06-11 21:29:23.371 12028-12028/com.example.AndroidOverlay W/System.err: 原因:java.lang.NoClassDefFoundError: Class not found using the boot class loader; 没有可用的堆栈 371 12028-12028/com.example.AndroidOverlay W/System.err: ... 25 更多 06-11 21:29:23.371 12028-12028/com.example.AndroidOverlay W/System.err: 原因:java.lang .NoClassDefFoundError:使用引导类加载器找不到类;没有可用的堆栈 371 12028-12028/com.example.AndroidOverlay W/System.err: ... 25 更多 06-11 21:29:23.371 12028-12028/com.example.AndroidOverlay W/System.err: 原因:java.lang .NoClassDefFoundError:使用引导类加载器找不到类;没有可用的堆栈

我使用来自http://central.maven.org/maven2/com/google/android/tools/dx/1.7/dx-1.7.jar的 dx-1.7.jar 和 byte-buddy-0.6.8.jar,byte- buddy-android-0.6.8.jar

我错过了什么吗?我也无法在您的 android 示例应用程序上运行动态类型。(解析失败:Lorg/objectweb/asmType;),似乎我错过了一些东西,一些库或者我不知道......谢谢你的回答。

EDIT1: 我使用 Lollipop,这就是我设置 AndroidClassLoadingStrategy 的方式:

设置为类 Messenger 我有方法 proxy(...)

并且 classLoadingStrategy 被定义为

编辑 2: 毕竟我采用了 ByteBuddy 示例应用程序,尝试了 Android lollipop 替换的行

对于应该替换的其中一个,尝试了所有这些并且都给出了相同的例外,只是来自不同的班级活动

仍然例外:

我创建并放置了我的网站资源,以便将来在此处重现错误:

bashism.com/shared/ByteBuddyTest.tar.gz

编辑3:

安卓版本:5.0.1 棒棒糖

设备:三星 Galaxy S4

IDE:IntelliJ Idea 14.1.3

编辑 4: 在主活动内部更改后:

在 net.bytebuddy.android.AndroidClassLoadingStrategy 里面

}

似乎工作/稳定,很快进一步调试

0 投票
2 回答
1983 浏览

java - 显示生成的 bytebuddy 字节码

我正在使用 ByteBuddy 在运行时使用动态生成的字节码创建一个类。生成的类做了它打算做的事情,但我想手动检查生成的字节码,以确保它是正确的。

例如

其中 MyImplementation 将多个 StackManipulation 命令链接在一起以创建动态生成的代码。

我可以将生成的类写入文件(以便我可以使用 IDE 手动检查),或者打印出生成类的字节码吗?