问题标签 [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 - Java 反射与 Javassist
我目前正在使用 Java Reflection 来实现反射属性。我知道有很多工具可以实现反射属性。其中之一是:Javassist,它与行为反射一起提供结构反射。但是,我只关心行为反射。
我的问题是:在现有的库(Java 反射/Javassist/任何其他)中,哪一个会擅长实现行为反射?我只担心性能(即他们行动的速度)。
提前致谢。
java-bytecode-asm - 动态 Java 字节码操作框架比较
有一些用于动态字节码生成、操作和编织的框架(BCEL、CGLIB、javassist、ASM、MPS)。我想了解它们,但是由于我没有太多时间了解它们的所有细节,所以我希望看到一种比较图表,说明一个与另一个的优缺点以及对它们的解释为什么。
在 SO 中,我发现很多问题都在问类似的问题,答案通常是“你可以使用 cglib 或 ASM”,或者“javassist 比 cglib 好”,或者“BCEL 已经老了,快要死了”或者“ASM 是最好的,因为它给出了 X 和 Y”。这些答案很有用,但并没有完全回答我想要的范围内的问题,更深入地比较它们并给出每个的优缺点。
javassist - 使用 Javassist 调用方法
我是 Javassist 的新手并尝试了一些教程。我了解 Javassist 有助于操作字节码并有助于实现结构反射。正如 wiki ( http://en.wikipedia.org/wiki/Javassist ) 中提到的,我相信它确实支持实现反射。
我正在尝试进行基本评估,以了解 java 反射调用方法需要多少时间以及 javassist 需要多少时间。在此过程中,假设我有一堂课:
现在,使用 java 反射 api,我将使用以下代码来计算调用 100 个对象需要多少时间:
现在,我不确定如何继续使用 javassist。IE,
我将创建一个 ctclass 对象并存储我要阅读的类。我还可以使用 getdeclaredmethods 获取所有声明的方法并将其存储在 ctMethod 变量中。
但是,与java反射api不同,我在javassist的ctMethod api中找不到调用方法。这是否意味着,我必须创建一个重复的方法,并且必须按照以下说明调用原始方法:http: //www.ibm.com/developerworks/java/library/j-dyn0916/index.html。
我不确定这是否是正确的方法。
我错过了什么吗?
java - 从 Java 字节码中删除指令
我一直在使用Javassist在加载类时动态操作它们。虽然使用 Javassist 向方法中添加代码相对容易,但我一直无法找到删除代码的方法。
这时候我正在模拟代码的移除,通过使用nop指令替换目标操作码和任何参数。但是,我认为这主要是一个 hack:
每个操作码都必须单独处理,因为参数的字节长度不同。在某些情况下,我还需要在nop和pop之间进行选择,具体取决于删除的操作码是否影响堆栈。这种操作开始变得乏味 - 并且执行它的代码也相应变得复杂。所以,自然地,我希望有一个现有的解决方案。
最终结果是用nop指令填充的。虽然 JVM 应该在不影响性能的情况下优化这些字节码,但生成的字节码仍然非常不优雅并且比它应该的更大。这更多的是美学问题,但仍然需要考虑。
不幸的是,仅仅移动字节码数组的一部分来缩小差距是不够的——任何对移动代码的引用(例如分支指令索引)也应该更新。
是否可以使用 Javassist 删除指令?或者,是否有一个字节码操作库可以让我轻松地做到这一点,而不必自己解析字节码?
java - Javassist - 将字段访问重定向到方法(不起作用)
我有以下课程
我使用以下方法对其进行检测:
现在当我这样称呼时:
给我
我错过了什么?这似乎是我应该能够轻松完成的事情之一。
请不要告诉我我必须在所有课程上做一个毯子“fieldAccess.replace”?面向对象
java - Javassist:检查对象是否是代理
我javassist.util.proxy.ProxyFactory
用来在我的项目中创建一些代理。在代码的其他部分,我希望能够检查一个对象是否被代理。
所以我的问题是:有没有办法检查一个对象是否是代理?
例如,我有一个 User 类,当我创建它的代理对象时,在调试器中它的类是User_$$_javassist_11
. 是否有类似的东西instanceof
可以用于此目的?
java - 修改 Javassist 代理命名策略
当使用 Enhancer 在 CGLib 中创建代理时,您可以调用.setNamingPolicy(NamingPolicy n)
以将代理类命名策略更改为 CGLib 默认值以外的策略。使用 ProxyFactory 时,有没有办法在 Javassist 中做类似的事情?
java - 我们可以使用 javassist 将非原始字段添加到现有类吗?
我是 Javassist 的新手,我已经阅读了一些与它相关的教程。
因为我需要在每个方法进入或方法退出之前进行一些字节码注入,并从中获取一些统计信息。
通过网上的javassit教程,我发现我们可以为一个已有的类做一个新的字段:
但是 CtField 的类型默认只包含原始类型,我们可以添加一个非原始类型的新字段,例如 ArrayList 吗?
如果我可以将新的 ArrayList 字段添加到现有类中,由于该类不导入 java.util.ArrayList,是否会导致编译错误?
java - 使用javassist获取操作数据
我正在尝试使用简单的类使用 javassist 分析字节码MyData
:
这是我针对此类运行的代码:
它可以工作并打印:
第 35 行调用add()
名为 的集合的方法strings
。我发布的代码片段仅检索invokeinterface
第 35 行。好的,我可以知道它是类字段 ( getfield
)。
我想知道如何获取其余信息:
- 字段名称是
strings
- 被调用的接口方法是
add()
到目前为止,谷歌搜索和阅读 API 文档都没有给出任何积极的结果。
java - 使用 playframework 获取 javassist 类
我正在尝试获取对我的模型类的 CtClass 引用。我从最简单的版本开始,
ClassPool.getDefault().get(className);
效果很好。但只在我的机器上。它在服务器上不起作用。
无论如何,我认为该版本不应该工作,因为 Playframework 将类存储在 tmp/classses 中。所以现在我完成了这个版本:
但我不确定这个版本。它会一直工作吗?有更好的选择吗?
我也尝试使用 ClassClassPath 和 LoaderClassPath 但没有任何成功。