问题标签 [byte-code-enhancement]
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.
spring - Hibernate @LazyToOne(LazyToOneOption.NO_PROXY) @OneToOne(fetch = FetchType.LAZY) 总是急切地获取
我的目标是在关联的父端为双向一对一关联启用延迟加载。考虑以下两个实体:
家长Vendor.java
:
孩子Operator.java
:
注意:为简洁起见,我省略了其他字段、构造函数和 equals/hashCode 函数。
如前所述,我的目标是懒加载供应商的操作符。因此,按照Hibernate 用户指南和Vlad Mihalcea 关于如何在 Hibernate 中启用字节码增强的教程@LazyToOne(LazyToOneOption.NO_PROXY)
,我在@OneToOne
with之外注释了父端关联fetch = FetchType.LAZY
。将以下插件添加到 mypom.xml
后,操作员在获取供应商时仍会急切地加载。
插件配置:
当我获取供应商时,会生成以下 SQL:
当我注释掉 中的操作符字段时Vendor.java
,只生成第一条语句。我还尝试按照此答案spring.jpa.properties.hibernate.ejb.use_class_enhancer
中的建议设置属性,但它没有更改生成的 SQL。我担心这个问题可能与in的映射有关,因为在Hibernate 示例中没有使用它。@MapsId
Operator.java
使用框架的版本:
Spring Boot 2.1.9.RELEASE
Hibernate5.3.12.Final
java - 值得使用 Hibernate Bytecode Enhancement 机制吗?
我目前正在阅读 Vlad Mihalcea 的书High-Performance Java Persistence。
在字节码增强部分,据说enableDirtyTracking
可以通过替换反射来优化大量数据的性能。但我只是想知道是否有任何缺点?
不幸的是,我找不到任何或只有非常旧的信息。
在对 Hibernate 文档进行进一步研究时,我发现了另外三个属性:
enableLazyInitialization
,enableAssociationManagement
,enableExtendedEnhancement
.
但我在互联网上找不到太多关于它的信息。
如果我理解正确,enableAssociationManagement
那么独立处理双向关系就变得多余了,而是enableLazyInitialization
像enableDirtyTracking
反射一样替换?
不幸的是,我找不到任何关于enableExtendedEnhancement
. 这就是为什么我有与上面相同的问题。我应该只使用它吗?或者它会导致哪些缺点?
hibernate - 如何使用 SBT 为 Hibernate 启用字节码增强?
我已经看到使用 Maven 插件可以非常轻松地完成 Hibernate 字节码增强: https ://vladmihalcea.com/how-to-lazy-load-entity-properties-with-hibernate/
还有一个用于字节码增强的 Gradle 插件。旧版本的 Hibernate 有一个 ANT 任务。
但是......我怎样才能为 SBT 项目(Java Play 和 Hibernate 5)做到这一点?
c - “紧凑”字节码的好处 - stack-machine VM
首先,让我明确一点,我目前正在编写一个字节码解释器。
我一直在到处阅读有关字节码必须“紧凑”的信息。但是,我真的不明白这应该是什么意思,或者好处是什么。
目前,例如,我的“字节码”是一个元组数组,第一个元素是一个字节 - 操作码本身(8 位),第二个元素是 uint64 (人们称之为 an unsigned long long
) - 操作的可选参数( 64 位)。
Tha 使每个“指令”为 72 位。(诚然,这是非常不必要的,因为他们中的许多人不接受任何参数,但我认为它更容易 - 并且性能更高? - 这样,因为我不必每次都检查是否有参数,只需通过指令列表)。
所以,我的问题:
- 更紧凑的代码有什么好处?(例如,如果每条指令是 32 位而不是 72 位,我会实现什么?)
- 我该怎么做才能让它变得更好?(如何以有效的方式处理“可选”参数?即:可变大小的指令)
eclipse - 如何在 Eclipse 中可靠地设置编译后字节码增强构建器?
我需要使用一个附加构建器来设置一个 Eclipse 项目,该构建器增强了早期构建器(最好是 Eclipse 自己的)生成的 Java 字节码。我设法让这个构建器正确运行并增强了 Eclipse Java 构建器的输出,但几秒钟后 Eclipse 重新运行了它的 Java 构建器并重新设置了字节码。它不会重新运行我的增强生成器。
我的设置
- 作为“Gradle 项目”导入 Eclipse 2019-12(使用 Buildship)。
- 手动(并使用 Gradle 自动添加)自定义Ant构建器(最终调用 Gradle)以增强 Eclipse Java 构建器在 bin/main 中生成的代码。此构建器设置为在Manual Build和Auto Build上运行,而不是After a "Clean"或during a "Clean"。
- 默认情况下,上面的最终有三个构建器,从上到下:1. Gradle Project Builder, 2.Java Builder和 3.我的字节码增强构建器(是的,它在最后列出)。
我尝试过的替代方案
- 将我的构建器设置为在“清洁”之后/期间运行的一些组合也没有成功。不确定这些与哪些确切事件有关,真的。
- 让建造者在之后刷新项目......而且也没有 - 没有帮助。
尝试使用 Gradle 脚本中的以下位删除 Java Builder(不起作用 - 它会自行恢复):
/li>尝试手动禁用 Java 构建器并让我的字节码增强构建器也构建文件本身(使用 Gradle)。这将存储
/li>org.eclipse.jdt.core.javabuilder.launch
具有以下内容的以下文件文件...但重新启动构建器时会重新启用:我尝试(但失败)查找是否有一些工作区文件(而不是项目文件)被更改(以及)以禁用 Java 构建器。
问题
- 为编译后字节码增强设置 Eclipse 的“正确”方法是什么?
- 是什么导致 Eclipse 重新运行以前的构建器而不重新运行我的?
- 有没有办法解决(1)?
- 如何可靠地禁用 Java 构建器?
任何人都可以帮忙吗?谢谢!
更新附加细节 我添加了 12 个构建器,并让它们都将输出附加到同一个日志文件以进行研究。12 个额外的构建器只是提供信息 - 4 个在 Java 构建器之前,4 个在 Java 和增强构建器之间,4 个在增强构建器之后。12 个中的每一个都只在四种条件之一中运行(因此为 3x4)。它们排列如下:
- Gradle 项目生成器
- 1a-after-clean(仅在 "Clean" 之后运行)
- 1b-manual(仅在手动构建期间运行)
- 1c-auto(仅在自动构建期间运行)
- 1d-during-clean(仅在 "Clean" 期间运行)
- Java 生成器
- 2a-after-clean(仅在 "Clean" 之后运行)
- 2b-manual(仅在手动构建期间运行)
- 2c-auto(仅在自动构建期间运行)
- 2d-during-clean(仅在 "Clean" 期间运行)
- 字节码增强生成器
- 3a-after-clean(仅在 "Clean" 之后运行)
- 3b-manual(仅在手动构建期间运行)
- 3c-auto(仅在自动构建期间运行)
- 3d-during-clean(仅在“清洁”期间运行)
12 个信息构建器中的每一个都写下时间、名称和所选测试类的大小。未增强的长度为 46243 字节。增强后它变为 53338 字节长。
这是仅在此项目上运行“清理”后的日志(启用“自动构建”):
更新 2:重现的最小示例
- 创建一个文件夹 - 随意命名。
在该文件夹中创建包含以下内容的build.grade文件:
/li>在那里也创建一个 src/main/java/learner/TestEntity.java 如下:
/li>执行
gradle compileJava
。build/classes/java/main/learner/TestEntity.class
在 ASCII 或十六进制查看器中打开生成的二进制文件并观察$$_hibernate_write_name
其中的内容。- 将此项目作为 Gradle 项目导入 Eclipse(比如 2019-12)并构建它。打开结果
bin/main/learner/TestEntity.class
并观察不到这些。
spring - Spring Data JPA + 字节码增强
是否可以使用在父实体类中使用 @LazyToOne 、 @LazyGroup 设置为惰性并启用字节码增强的 JPA 接口(实体图)急切地加载 @*ToOne 属性?我正在尝试使用实体图急切地加载此类属性,但是当查询父实体时,它正在为此类 @*ToOne 属性触发另一个查询。
尝试使用另一种方法来覆盖实体类中的静态获取类型,包括添加了字节码增强功能的 @LazyToOne。
使用 Spring 5.1.3、Spring JPA 2.2、Hibernate 5.4.19
更新:数据 JPA 正在按预期工作,我可以看到我试图急切地获取的属性的连接,但是这些惰性属性没有被连接查询响应初始化,并且休眠导致每个查询都引用了 @LazyToOneOption 注释的属性.NO_PROXY 并且已经在我的存储库中使用实体图急切地获取。
我如何避免第二次选择,因为我急切地从 JPA 存储库中的实体图中获取了该数据?
任何帮助将不胜感激。
java - Hibernate 5.3.7 的字节码增强
我曾经在 Hibernate 4.x 中使用 ant 目标来检测我的类:
但是当我升级到 Hibernate 5.3.7 时,这停止了工作。在蚂蚁中执行此操作的正确方法是什么?注意,我不使用 Maven。
我试过这个改变
但它输出 [enhance] Unable to enhance class: Publication.class
表示它不工作。它增强了该目录中的一些类,但不是我需要的。
java - How to enhance classes properly at build time using Maven? OpenJPA
I am trying to enhance (entities) classes so i will not get this Exception:
saying that my instance i am trying to persist is not enhanced.
I have followed this: https://openjpa.apache.org/enhancement-with-maven.html official openjpa page and added openjpa-maven-plugin
to the section of my pom.xml:
, but i still get that exception. I am using Eclipse and built in command Run As -> Maven install
. I also tried to run mvn install
from command line. Then i just try to persist some entity using EntityManager
.
Running mvn install
with and without openjpa-maven-plugin does not change anything (same .jar generated with same .class files, same maven output to console)
As answer says, i needed to run openjpa:enhance
goal when building with Maven. I was de facto not using openjpa-maven-plugin
, so i fixed that. Maven output:
You can see i run enhancer on EntityPerson class, which is simple JPA entity i tested this on. However i still get that Exception. I noticed maven-compiler-plugin:3.8.1:compile
running twice. Before and after openjpa-maven-plugin:3.1.2:enhance
- might this be problem?
I think this is not my case: How to enhance a class from a separate jar at build time with openJPA?
Found there is workaround Attempt to cast instance to PersistenceCapable failed. Ensure that it's been enhanced by setting some attribute in configuration as accepted answer says, but i do not want to do it that way, as first comment says it is not recommended and points to the official openjpa page, where i found that example how to enhance classes during maven build time, but as i wrote, it does not work.
Testing main method:
EntityPerson class:
persistence.xml:
Project structure:
Steps to reproduce:
- Crete Maven project in Eclipse
- Copy my pom.xml (or add dependencies to derby, openjpa and set up your openjpa-maven-plugin, names and paths)
- Copy my persistence.xml (or create your own with some persistence unit)
- Copy my EntityPerson class (or create simple JPA entity to test it on)
- Run mvn clean compile openjpa:enhance install (important part is openjpa:enhance)
- Try to persist entity as i did in my main method
java - 无法使用 Byte Buddy 和 Android Buddy 拦截 Android 视图方法调用。我怎样才能做到这一点?
我想拦截android视图类方法调用。例如,在视图类中有一个方法名称 getHeight()。因此,当从我的代码 obj.getHeight() 调用时,我想拦截它并希望返回一个任意值。
我可以拦截我自己的类方法调用。但不能用 android 视图类做到这一点。我正在使用使用 Byte Buddy 的 Android Buddy。所以这是我的代码
这是 ViewTransformation 插件的代码。
我从 MainActivity 的 onCreate 方法调用 getHeight() 方法。
java - 导致 OpenJPA 日志记录的原因 实体在某个级别得到了增强,但当前的增强级别是另一回事
这可能是什么原因,这意味着什么?我只是用字节码增强了我的实体并运行了应用程序。在 openjpa 启动时,我会在日志中获得以下信息:
从我的角度来看,没有发现任何问题。
Maven 中的 pom 插件: