问题标签 [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.
jboss - JBoss 6.x 上的 jsf-console 3.x 可能吗?
我正在尝试将应用程序从 JBoss 4.2.2 AS 移动到 6.x AS。现在我正试图让 jbpm 3.x 在 AS 上运行我在尝试将 .par 文件上传到服务器时遇到这个问题:
13:41:51,713 错误 [org.jbpm.db.GraphSession] (http-127.0.0.1-8888-1) java.lang.ClassCastException:org.jbpm.graph.def.Node_$$_javassist_92 无法转换为 javassist。 util.proxy.ProxyObject
然后导致: 13:41:51,740 错误 [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/app].[ProcessUploadServlet]] (http-127.0.0.1-8888- 1) Servlet ProcessUploadServlet 的 Servlet.service() 抛出异常:org.jbpm.JbpmException:找不到流程定义“ProcessName”。
我尝试过使用 javassist 的旧版本和新版本,但都没有积极作用。有任何想法吗?
java - Constructor.newInstance() 不知道参数顺序?
以这段代码为例:
我们可以使用User.class.getConstructors()
并发现有 2 个构造函数,使用constructor.getParameterTypes()
,我们可以识别出有一个带有两个字符串参数的构造函数。我们还可以使用反射找到两个属性:用户名和密码。但是,在运行时,我们不知道用于调用构造函数.newInstance(?,?) 的两个参数的正确顺序。
constructor.newInstance(username , password)
,并且constructor.newInstance(password , username)
都是合法的,但结果完全不同。
我无法使用User.class.newInstance()
和设置属性值,因为无参数构造函数受到保护。
我遇到这个问题是因为我正在尝试编写一个通用的 JPA CRUD 工具。列表/读取/更新/删除都可以。但是现在我面临无法在线创建对象的问题。实体类都具有受保护的无参数构造函数(因此我不能使用 class.newInstance())和一个大量参数的公共构造函数(但参数名称在运行时被删除)。
这该怎么做 ?javassist 或其他代理技术有帮助吗?如何 ?非常感谢 !
plugins - 在 PlayPlugin.enhance 期间找不到类的问题
我正在尝试在 Play 插件中进行基本的字节码增强,但是当它尝试对其提供的内容进行操作时,ApplicationClasses.ApplicationClass
找不到该类。
例外是
Play 框架正在调用该enhance
方法。它不应该比处理尚不可用的类更好吗?我如何让这个工作?
java - 验证错误:opc_invokeinterface 的 args_size 不一致
我一直在尝试生成一些动态代码(使用 Javassist),但是当涉及双数组或浮点数组时,程序在某个点失败。代码如下
生成代码如下
但是当调用 getDeclaredConstructors 时会出现问题 c.getDeclaredConstructors() ...它会引发以下错误
线程“主”java.lang.VerifyError 中的异常:(类:testapp1/Dyn,方法:processDouble 签名:(Lsomething/Output;Ljava/lang/Object;)V)opc_invokeinterface 的 args_size 不一致
存在一种解决方法,但没有任何意义,即如果我只是创建双精度数组的副本并将其传递给动态代码中的 processDouble,即如果动态代码是
简而言之,getDeclaredConstructor 抛出异常 Unhandled 但它实际上与构造函数无关,因为我是否创建一个都没有关系
希望我的问题和代码足够清楚,如果有任何混淆请告诉我,谢谢你提前:)
java - Hibernate 代理对象不适用于超类方法
我们有一个使用 Hibernate 的 Web 应用程序。在将代码库升级到 Hibernate 3.6(从 3.3.2)后,我发现 Hibernate 生成的代理数据对象只为某些方法返回正确的值。似乎具体数据模型类中的方法工作正常,但@MappedSuperclass
抽象超类中的方法不起作用。
这是我们拥有的数据模型:
这在 Hibernate 3.3.2 中运行良好,但在升级到 Hibernate 3.6 后,应用程序出现了问题。下面的测试代码说明了这个问题:
该代码的输出是:
其中四个方法返回了错误的结果:getId()、getVersion()、getLastUpdateDate() 和 getCreatedDate() 返回了 0 或 null。数据库中的实际行具有非零/非空值。但是 getName()、getPath() 和最奇怪的是 getSecurityId() 都运行良好。
谁能解释为什么会这样?这是映射超类的基本问题,还是有其他原因导致这种情况发生?
请注意,Form
Hibernate 返回的对象是 Javassist 代理 - 如果在调试器中查看,它通常具有类似Form_$$_javassist_15
etc的类名。
更新:
这个问题似乎发生在 Hibernate 中,而不是 Javassist 中。我通过在 hibernate.properties 中设置将字节码生成切换到 CGLIB hibernate.bytecode.provider=cglib
,但是使用 CGLIB 得到完全相同的错误结果(并且确认 CGLIB 正在工作,因为 Hibernate 返回的类名变为Form$$EnhancerByCGLIB$$4f3b4523
)。
不过,我仍然无法确定为什么会出错。
java - 是否可以修改字节码并使用 javassist 保存?
我在网上找到的所有参考资料都说字节码可以在运行时修改,但我似乎没有发现修改后的字节码是否可以替换原始字节码。
这样,原始字节码可以被替换一次,其余时间使用增强后的字节码。
java - Hibernate 自定义代理生成器 - 停止 equals() 初始化惰性代理
我有实体类,这些实体类实现了它们自己的 equals() 函数,它只是比较类的 Id。可悲的是,在 Hibernate 代理上调用 equals() 会对其进行初始化,这在我的情况下完全没用。
我使用 javassist 作为代理提供者。有没有办法修改代理生成代码以在 equals 调用期间不加载实体,而是为我做其他事情?我可以在 Hibernate 中插入自定义代理提供程序吗?
请不要开始讨论 equals 在 Hibernate 中应该如何表现,这已经很远了,关于这个话题有不同的意见,我已经知道了,这不是问题的一部分:)。
java - java中调用接口方法时如何计算count参数?
我正在使用 javassist,并在加载时/运行时生成接口和其他东西。
要调用接口的方法(使用字节码调用接口),我们必须提供几个参数:indexbyte1、indexbyte2、count 和 0(来自http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2。 doc6.html )。
已经有了我想调用的抽象方法(CtMethod),我该如何计算它的计数?
例如,在http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc6.html中,他们说“ invokeinterface 指令的计数操作数记录了参数值数量的度量,其中long 类型或 double 类型的参数值对计数值贡献两个单位,任何其他类型的参数贡献一个单位。此信息也可以从所选方法的描述符中得出。冗余是历史的。
但也要说“计数操作数是一个不能为零的无符号字节。 ”
如果我要调用的抽象方法没有参数,它将计数为 0!?但是count不能为0。方法的描述符是()V。
有什么建议么?
java - Javassist - 向类添加注释不适用于反射
我正在使用 javassist 创建一个类并为其添加注释。当我使用 CtClass.writeFile 并且看到带有 Java 反编译器的类文件时,注释就在那里,但是当我使用 class.getAnnotations() 或 class.getDeclaredAnnotations() 时,列表为空。
java - 如何从字节码中获取有关方法的信息?
我想发现在方法内部创建了哪些对象以及与字节码相关的变量的名称?我能发现吗?我尝试使用 javassist 失败。任何想法?