问题标签 [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.

0 投票
2 回答
2322 浏览

java - Java 反射与 Javassist

我目前正在使用 Java Reflection 来实现反射属性。我知道有很多工具可以实现反射属性。其中之一是:Javassist,它与行为反射一起提供结构反射。但是,我只关心行为反射。

我的问题是:在现有的库(Java 反射/Javassist/任何其他)中,哪一个会擅长实现行为反射?我只担心性能(即他们行动的速度)。

提前致谢。

0 投票
3 回答
8784 浏览

java-bytecode-asm - 动态 Java 字节码操作框架比较

有一些用于动态字节码生成、操作和编织的框架(BCEL、CGLIB、javassist、ASM、MPS)。我想了解它们,但是由于我没有太多时间了解它们的所有细节,所以我希望看到一种比较图表,说明一个与另一个的优缺点以及对它们的解释为什么。

在 SO 中,我发现很多问题都在问类似的问题,答案通常是“你可以使用 cglib 或 ASM”,或者“javassist 比 cglib 好”,或者“BCEL 已经老了,快要死了”或者“ASM 是最好的,因为它给出了 X 和 Y”。这些答案很有用,但并没有完全回答我想要的范围内的问题,更深入地比较它们并给出每个的优缺点。

0 投票
1 回答
2560 浏览

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

我不确定这是否是正确的方法。

我错过了什么吗?

0 投票
2 回答
2432 浏览

java - 从 Java 字节码中删除指令

我一直在使用Javassist在加载类时动态操作它们。虽然使用 Javassist 向方法中添加代码相对容易,但我一直无法找到删除代码的方法。

这时候我正在模拟代码的移除,通过使用nop指令替换目标操作码和任何参数。但是,我认为这主要是一个 hack:

  • 每个操作码都必须单独处理,因为参数的字节长度不同。在某些情况下,我还需要在noppop之间进行选择,具体取决于删除的操作码是否影响堆栈。这种操作开始变得乏味 - 并且执行它的代码也相应变得复杂。所以,自然地,我希望有一个现有的解决方案。

  • 最终结果是用nop指令填充的。虽然 JVM 应该在不影响性能的情况下优化这些字节码,但生成的字节码仍然非常不优雅并且比它应该的更大。这更多的是美学问题,但仍然需要考虑。

不幸的是,仅仅移动字节码数组的一部分来缩小差距是不够的——任何对移动代码的引用(例如分支指令索引)也应该更新。

是否可以使用 Javassist 删除指令?或者,是否有一个字节码操作库可以让我轻松地做到这一点,而不必自己解析字节码?

0 投票
1 回答
1196 浏览

java - Javassist - 将字段访问重定向到方法(不起作用)

我有以下课程

我使用以下方法对其进行检测:

现在当我这样称呼时:

给我

我错过了什么?这似乎是我应该能够轻松完成的事情之一。

请不要告诉我我必须在所有课程上做一个毯子“fieldAccess.replace”?面向对象

0 投票
1 回答
4094 浏览

java - Javassist:检查对象是否是代理

javassist.util.proxy.ProxyFactory用来在我的项目中创建一些代理。在代码的其他部分,我希望能够检查一个对象是否被代理。

所以我的问题是:有没有办法检查一个对象是否是代理?

例如,我有一个 User 类,当我创建它的代理对象时,在调试器中它的类是User_$$_javassist_11. 是否有类似的东西instanceof可以用于此目的?

0 投票
2 回答
458 浏览

java - 修改 Javassist 代理命名策略

当使用 Enhancer 在 CGLib 中创建代理时,您可以调用.setNamingPolicy(NamingPolicy n)以将代理类命名策略更改为 CGLib 默认值以外的策略。使用 ProxyFactory 时,有没有办法在 Javassist 中做类似的事情?

0 投票
1 回答
5366 浏览

java - 我们可以使用 javassist 将非原始字段添加到现有类吗?

我是 Javassist 的新手,我已经阅读了一些与它相关的教程。

因为我需要在每个方法进入或方法退出之前进行一些字节码注入,并从中获取一些统计信息。

通过网上的javassit教程,我发现我们可以为一个已有的类做一个新的字段:

但是 CtField 的类型默认只包含原始类型,我们可以添加一个非原始类型的新字段,例如 ArrayList 吗?

如果我可以将新的 ArrayList 字段添加到现有类中,由于该类不导入 java.util.ArrayList,是否会导致编译错误?

0 投票
1 回答
1607 浏览

java - 使用javassist获取操作数据

我正在尝试使用简单的类使用 javassist 分析字节码MyData

这是我针对此类运行的代码:

它可以工作并打印:

第 35 行调用add()名为 的集合的方法strings。我发布的代码片段仅检索invokeinterface第 35 行。好的,我可以知道它是类字段 ( getfield)。

我想知道如何获取其余信息:

  • 字段名称是strings
  • 被调用的接口方法是add()

到目前为止,谷歌搜索和阅读 API 文档都没有给出任何积极的结果。

0 投票
1 回答
635 浏览

java - 使用 playframework 获取 javassist 类

我正在尝试获取对我的模型类的 CtClass 引用。我从最简单的版本开始, ClassPool.getDefault().get(className);效果很好。但只在我的机器上。它在服务器上不起作用。

无论如何,我认为该版本不应该工作,因为 Playframework 将类存储在 tmp/classses 中。所以现在我完成了这个版本:

但我不确定这个版本。它会一直工作吗?有更好的选择吗?

我也尝试使用 ClassClassPath 和 LoaderClassPath 但没有任何成功。