- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经开发了一个库,该库在运行时生成给定抽象类中的某些注释的抽象类的特殊化类。
所以我的库有点像:
X x = newInstance(X.class) //X is an abstract class
newInstance
方法实例化。
最佳答案
在前往您的接送人之前:
是的,您是正确的,Hibernate当前使用Javassist(过去使用GCLib,但已弃用)在运行时检测类。
Hibernate会在运行时创建子类,该子类可以为您的持久实体提供代理。
简短答案
可悲的是,我认为您无法将Hibernate配置为使用自己的工厂。有关详细信息,我邀请您阅读详细答案部分。
长答案
据我所知,当前,Hibernate 4.x仅支持Javassist作为其字节码操作提供程序。虽然,它过去允许您在3.x版本中的GClib和Javassist之间切换。回到这些版本中,您可以通过配置称为hibernate.bytecode.provider
的休眠全局设置来修改要使用的工厂。
此设置不再显示在Hibernate 4.1 documentation中,但是您仍然可以在optional configuration properties下的Hibernate 3.2文档中找到有关此设置的信息。
作为自己的开发人员,我知道有时候我们会有些棘手,仅仅因为文档中有某些内容并不意味着它就不在代码中了:-)因此,即使设置仍然存在,我也可以尝试利用以便执行您想要的操作(不过以不受支持的方式)。
为求好奇,自从我在计算机中使用了Hibernate 4.0.1代码(尽管不是最新的通知)后,我做了一些挖掘工作...惊奇,惊奇地,该属性仍然存在!跟踪使用的引用(感谢Eclipse)后,我进入了org.hibernate.cfg.Environment(code for version 4.2.0.CR2)类,在其中发现了以下代码(我的版本和4.2.0CR2中的代码相同):
public static BytecodeProvider buildBytecodeProvider(Properties properties) {
String provider = ConfigurationHelper.getString( BYTECODE_PROVIDER, properties, "javassist" );
LOG.bytecodeProvider( provider );
return buildBytecodeProvider( provider );
}
private static BytecodeProvider buildBytecodeProvider(String providerName) {
if ( "javassist".equals( providerName ) ) {
return new org.hibernate.bytecode.internal.javassist.BytecodeProviderImpl();
}
LOG.unknownBytecodeProvider( providerName );
return new org.hibernate.bytecode.internal.javassist.BytecodeProviderImpl();
}
org.hibernate.bytecode.internal.javassist.BytecodeProviderImpl
操作合并一样。
BytecodeProviderImpl
,并将其放在相同的包
org.hibernate.bytecode.internal.javassist
中,最后将其放在类路径中的某个位置,在该路径中,类加载器会在jar中找到它(或者可以使用自定义类加载器)
public void registerCustomEntityPersister(Configuration configuration) {
final Iterator<PersistentClass> classesIterator = configuration.getClassMappings();
while (classesIterator.hasNext()) {
final PersistentClass persistentClass = classesIterator.next();
if (checkIfIsOneTheClassesThatMatters(persistentClass)) {
persistentClass.etEntityPersisterClass(CustomEntityPersister.class);
}
}
关于java - 使用Hibernate使用的Javassist实体类进行检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15587061/
Maven Artifact 之间有什么区别 javassist:javassist 和 org.javassist:javassist 在我的项目中,我的第一个依赖项是 3.8 版本,而我引入的第二
我有一个 CtMethod实例,但我不知道如何从中获取参数(不是类型)的名称。我试过 getParameterTypes ,但它似乎只返回类型。 我假设这是可能的,因为我使用的库没有源,只有类文件,我
可以使用 CtMethod.setBody("..") 设置方法主体,但我没有找到任何 API 来获取字符串格式的方法主体。 最佳答案 这不可能。 Javassist 不是反编译器。类文件中的方法以
可以使用CtMethod.setBody("..")设置方法体,但我没有找到任何API来获取字符串格式的方法体。 最佳答案 这是不可能的。 Javassist 不是反编译器。类文件中的方法用 Java
当使用 javassist 检测 com.sun.net.* 类时,我可以成功使用 .insertAfter 方法。但是,当尝试从 Glassfish 中运行的应用程序检测第三方类时,我收到错误: F
我正在使用 javassist 来更改方法体。当该方法在应用程序中定义时我可以做到这一点。但是,当我想更改应用程序使用的 jar 文件中定义的方法时,我会收到以下运行时错误: javassist.Ca
我在模型上使用 javassist:com.project.model.Model我已经尝试过各种组合如何为 ClassPath 和 CtClass 格式化字符串,但无济于事。 ClassPo
我正在处理 SpringMVC、Hibernate 和 JSON,但出现此错误。 HTTP Status 500 - Could not write JSON: No serializer found
我正在使用 javassist 创建一个类并为其添加注释。当我使用 CtClass.writeFile 并且我看到带有 Java 反编译器的类文件时,注释就在那里,但是当我使用 class.getAn
我想读取一个方法的返回值,并且我必须将其传递给使用 method.insertAfter 插入的代码。 示例: public String sayHello(){ return "1"; }
这是原始方法: @GET @Produces({"application/json"}) public Response getTermClouds(@Context SecurityCo
我正在尝试在应用程序启动期间使用附加功能来增强一些代码。整个设置本身工作正常,但有一点我认为 javassist 可能会生成错误的代码。 我正在特定类的特定方法上执行此操作,我之前检查过返回值实际上是
我正在编写一些 Javassist 代码来拦截方法调用并用代理替换它们。为此,我使用 ExprEditor 按以下方式替换调用: public static void main(String[] ar
我目前正在实现一个注释,强制字段通过 javassist 遵守条件。我想检查一个字段在读取时是否已初始化...因此,目前,我通过在虚拟机通过 Translator.onLoad(ClassPool p
我正在尝试使用 javassist 在编译时插入一些代码片段 环境 Java 8 Spring 启动 2.2.6 hibernate 5.4.12.Final Javasist nl.topicu
我对 javassist 有点问题,用方法处理程序装饰类。问题是方法处理程序与 Abc 类中的 method1 一起正常工作,但不会拦截对 Def 内部类中的 method2 的调用。 public
我将代码注入(inject)到 doGet 方法中 val replace = "" + " System.out.println(\"[before] " + className + "\")
我试图捕获分支和循环语句的条件表达式中涉及的变量值,例如: if (a + b < c - 5) { // here, capture value of a, b and c // if bo
我正在开发一个需要类检测的项目。我使用 javassist 因为在我的情况下进行检测非常方便。 我遇到了一个问题,可以使用以下代码片段进行描述: 假设 1 类: public class Class1
我试图在 java 类文件中找到类初始值设定项。我可以找到该方法,但如果在类文件中找不到 main,那么我希望它找到类初始值设定项并在那里注入(inject)代码。 如何使用 Javassist 找到
我是一名优秀的程序员,十分优秀!