首页 > 解决方案 > 使用 ASM 时如何忽略检测 getter/setter?

问题描述

我正在使用 ASM 库来检测一些类。我创建自己的实例MethodVisitor并覆盖它的一些方法,例如在方法开始visitCode()时调用MethodVisitor的方法。在这里,如果方法不是 getter/setter,我将插入我自己的代码。但是,如果访问者仅在方法的开头并且尚未访问该方法的其余部分,我怎么知道该方法是否不是 getter/setter?

我可以查看方法的名称,但这不是决定性的。为了测试一个方法是getter还是setter,我想检查该方法是否唯一做的事情是它在当前实例上使用GETFIELD或SETFIELD操作码,没有别的。

更新:visitField()我发现工作的一种方法是在我的ClassVisitor,而不仅仅是在上覆盖该方法visitMethod(),因此我存储类的所有字段名称并检查方法是否具有名称getX()setX()其中 X 是字段名称。这种方法会起作用,但它仍然是有限的,因为如果用户有这样一个命名的方法,但它不是一个 setter/getter。

标签: javainstrumentationjava-bytecode-asmbytecode-manipulationjvm-bytecode

解决方案


推荐阅读