问题标签 [javassist]
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.
java - 如何使用 Javassist 使抽象类成为非抽象类?
在我正在构建的一个小框架中,我想使用 Javassist 将某些抽象类更改为非抽象类。我已经将所有抽象方法转换为实现我需要的动态生成代码的非抽象方法。但是我还没有成功地使这个类成为非抽象类。我尝试过的与此类似:
假设c
是我想让非抽象的类。所以我写了:
但是,调用:
正在提出以下问题CannotCompileException
:
这是因为该类已经被加载,因为我正在调用它的getName
方法。在我看来,这是我必须CtClass
从现有课程中获得的唯一机制,但请有人告诉我这是否不正确。硬编码类的名称而不是调用它的getName
方法远非一个理想的解决方案,因为我需要将此例程应用于许多类。
任何解决方法可以做到这一点?如果根本不可能,我将动态生成一个扩展抽象类的新类,实现它的构造函数,以及它所有祖先的抽象方法(有点复杂,所以如果我成功制作了原始类非抽象代替)。
java - 在 Eclipse 插件中使用 Javassist
在将应用程序部署为 Eclipse 插件时,我在使用 javassist 时遇到问题,具体来说,以下代码:
正在抛出一个: javassist.NotFoundException
。
如果不用作插件的一部分,该代码可以正常工作。我试图了解问题是否出在我的插件的类路径配置中(似乎并非如此),或者与 Eclipse 在将插件项目作为 Eclipse 应用程序执行时使用的类加载器相关的问题。
触发问题的代码是自定义 Eclipse 编辑器的一部分。因此,当用户尝试打开与编辑器关联的文档时,它就会出现。javassist 试图加载的类是插件类的一部分。
提前感谢您提供任何线索!
java - 获取 Javassist 类型而不是实际的 Hibernate 实体类型
我偶然发现了一个非常烦人的情况:我使用 Hibernate 和 Spring 作为我的应用程序的后端,似乎在某些情况下,与特定实体有关系的实体没有从数据库中作为普通实体对象获取,但作为 Javassist 类型。例如:
我有具有以下关系的 Campaign 实体:
检索到与此活动相关的 salesAreas 后,我得到了 SalesArea_$$_javassist_56 的列表,而对于经销商,我得到了普通的 Hibernate 实体。由于客户端部分基于 GWT,我们使用 RequestFactory 来检索内容。我最初认为这是代理、定位器等的问题,但我在服务中设置了一个断点,这些断点在其中被检索,并且它们在选择它们后直接是 Javassist 对象。似乎即使删除 FetchType.LAZY 注释(尽管绝对不是理想的解决方案),也会发生同样的事情。这也发生在其他类型的关系中,不仅仅是@ManyToMany。
我们使用 GWT 2.3、Spring 3、Hibernate 3.6.3 和 JPA 2.0 进行注释。
任何建议,将不胜感激。
提前致谢
java - 在 JUnit 测试中使用 Javassist
我对JUnit和Javassist的了解比较浅,只是想用它们来做一些程序分析。例如,给定一个库,我想知道在运行时调用了库中的哪些方法。我可以使用字节码操作来插入 system.out.println("method_name"); 在方法的开头声明。所以在运行时,它会打印出调用了哪些方法。
在独立应用程序中,我可以在调用 main() 之前拦截并使用我自己的类加载器(见下文),但是在 JUnit 中没有 main(),谁能告诉我在这种情况下如何拦截?非常感谢。
编辑:我使用 JUnit 4.8 和 Javassist 3.15.0.GA
hibernate - 真的,如何实现休眠运行时检测?
从休眠文档中,我们知道在某些情况下,为了使延迟加载工作,我们需要构建时检测:
如何阻止 Hibernate 急切地获取多对一关联对象 one-associated-object
所以我做了以下事情:
但它给出了错误
java.lang.VerifyError: (class: com/mycompany/dao/UserDaoHibernateImpl$2, method: signature: (Lcom/mycompany/dao/UserDaoHibernateImpl;II)V) 期望在堆栈上找到对象/数组
这绝对是由于上面的仪器,因为删除它可以解决问题;网络搜索还表明,这在某种程度上与 javaasist 中的错误以及 spring 和 hibernate 版本之间的冲突有关。
我正在使用休眠 3.5.6-Final,Spring 3.0.6-RELEASE
我已经尝试了javassist版本的所有组合,并尝试将javassist更改为asm,也有各种版本,但问题仍然存在。
谢谢杨
javassist - 为什么 Javassist 在明确指定时坚持寻找默认注释值?
我正在使用Javassistpackage-info
在“类”上添加和修改注释。
在某些情况下,我需要处理以下边缘情况。有人(错误地)@XmlJavaTypeAdapters
在包上指定了注释package-info
,但没有提供value
属性(定义为 required)。所以它看起来像这样:
在 Javassist 中,这有点奇怪。
正如预期的那样,javassist.bytecode.annotation.Annotation
表示@XmlJavaTypeAdapters
注释的没有成员值(getMemberValue("value")
返回null
)。
当然可以添加value()
成员值,这就是我所做的:
在上面的代码片段中,我创建了一个新的成员值来保存一个注释数组,因为 of 的value()
属性@XmlJavaTypeAdapters
是一个@XmlJavaTypeAdapter
. 我已经通过尝试预测类似 Zen 的文档的意图来指定它的数组类型——似乎如果你提供另一个MemberValue
,它MemberValue
会以某种方式作为数组的类型。在我的情况下,我希望数组的类型是@XmlJavaTypeAdapter
,这是一个注释,所以唯一MemberValue
合适的类型是AnnotationMemberValue
. 所以我创建了一个空的并将其设置为数组类型。
只要您保持“在”Javassist 之内,就可以正常工作。
然而,似乎出了点问题。如果我要求 Javassist 将其所有专有注解转换为真正java.lang.annotation.Annotation
的 Java,那么当我尝试访问value()
该注解的属性时@XmlJavaTypeAdapters
,Javassist 告诉我没有默认值。嗯?
换句话说,这很好——确实没有——但我已经指定了我希望的零长度数组(也就是说,不应该使用默认值;应该使用我明确指定的零长度数组):
那么为什么 Javassist 在这种情况下要寻找一个默认值呢?
我更大的问题当然是处理这种情况(不幸的是有些常见),其中@XmlJavaTypeAdapters
指定了没有更多信息的情况。我需要添加一个可以容纳注释value
数组的成员值。@XmlJavaTypeAdapter
我似乎无法弄清楚如何使用 Javassist 来实现这一点。一如既往,所有帮助表示赞赏。
java - Javaassist 和 Webstart
这看起来像是一个已解决的老问题,但不幸的是我找不到好的参考。我有一个使用 Javaassist 的 Java 应用程序。在我将其升级为 webstart 应用程序之前,它运行良好。现在Javaassist 给了我一个classNotFoundException。该课程肯定在课程路径中。
我发现这篇相关的帖子https://community.jboss.org/message/302408 有点旧,我无法解码。有人可以帮我看看吗?
谢谢
这是代码片段:
堆栈跟踪中没有任何内容。
问题实际上是ClassLoader。JNLP 使用与 java 命令行不同的类加载器。问题是如何协调 JNLP 类加载器与 Javassist。
java - Javassist,字节码操作
我正在尝试在 java 类文件中找到类初始值设定项。我可以找到方法没问题,但是如果在类文件中找不到 main,那么我希望它找到类初始化程序并在那里注入代码。
如何使用 Javassist 找到类的初始化程序?
java - JPA/Hibernate 代理未获取真实对象数据,将所有属性设置为 null
我正在将 Hibernate 与 JPA 一起使用,并且具有如下所示的关系:
由于我开始使用 LAZY 提取类型,每次我尝试获取铅笔的所有者 ( pencil.getOwner ) 时,我都会得到一个非空对象,该对象的所有内部属性都设置为空。
我看起来像 Hibernate 创建的代理在它应该从数据库中获取真实对象时没有。
有任何想法吗?谢谢 :)
reflection - 使用 Javassist 创建新类型
输出是:
getMom setMom java.lang.NoSuchMethodException: PPerson.getMom(main.Person) at java.lang.Class.getDeclaredMethod(Unknown Source) at main.Main.main(Main.java:69)
为什么它第二次看不到“getMom”字段?