如何通过接口类型检测Java局部变量,然后找到在其上调用的方法?

功率统计

我有一些(也许)奇怪的要求-我想检测给定接口名称的局部(方法)变量的定义。当找到这样的变量时,我想检测将在该变量上调用哪些方法(set / get *)。我没有运气就尝试了Javassist,现在我对ASM有了更深入的了解,但是不确定是否可以得到我想要的东西。原因是我想用GraphViz生成依赖于相同数据结构的bean的依赖关系图。如果有可能做到这一点,请有人提示我该怎么做?也许还有其他框架可以做?

2015年1月1日

为了使事情更清楚:

该界面是自行编写的-整个操作的目标是第一步自动创建依赖关系图-稍后应在基于依赖关系的图形编辑器上实现。我不知道FindBugs / PMD如何工作,因为它们还使用字节码并检测例如空指针调用(变量未初始化,将在其上调用方法)。所以我认为我可以用同样的方式来实现我的想法。整个代码都是基于Spring的-也许这可以为这个问题打开另一个解决方案?最后但并非最不重要的一点是,我可以在Source-jar上工作?

处理问题时-是否可以通过ASM / javassist从接口检测所有可用方法并在其他类中找到对它们的调用?

霍尔格

恐怕您想做的事是不可能的。在已编译的Java代码中,源代码中没有形式的局部变量。方法使用具有为局部变量保留的内存的堆栈帧,该内存由数字索引寻址。该类型由指令的写意所隐含,并且可能随着方法的代码在整个方法代码中发生变化,因为该内存可能会被具有相异作用域的不同变量重用。另一方面,名称是完全不相关的。

当字节码得到验证时,将对所有对堆栈帧的指令的影响进行建模,以推断在执行的每个点上每个堆栈帧插槽的类型,以便可以检查所有操作的有效性。从类文件版本开始50,将通过包含显式类型信息(但仅适用于带有branchs的代码)来提供有助于该过程的StackMapTable属性对于顺序代码,变量的类型仍然必须通过推导得出。

这些推断的类型不一定是声明的类型。例如,在字节码级别上,两者之间没有区别

CharSequence cs="foo";
cs.charAt(0);

String s="foo";
((CharSequence)s).charAt(0);

在这两种情况下,都将String常量存储到局部变量中,然后调用接口方法。String在两种情况下都将使用推断的类型,并且调用CharSequence被视为有效的String实现方法CharSequence

这与检测是否存在使用CharSequenceinterface)类型声明的局部变量的想法相反,因为实际声明的类型无关紧要,也不存储在常规字节码中。


但是,有一些调试属性包含有关局部变量的信息,请参见该LocalVariableTable属性如果存在此类信息,ASM之类的库将告诉您有关声明的信息。但是您不能依赖这些可选信息。例如,Oracle的JRE库默认情况下不带它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在局部变量上调用的Java 8方法引用

来自分类Dev

在对象上调用获取方法与将其存储为局部变量(内存占用量,性能)

来自分类Dev

如何在堆文件中找到局部变量

来自分类Dev

通过反射访问main方法中的局部变量

来自分类Dev

如何通过在其他元素上调用上下文来在输入类型“文件”上调用“单击”?

来自分类Dev

返回接口类型的Java方法

来自分类Dev

java.lang.VerifyError:字节码检测后,局部变量类型错误

来自分类Dev

如何通过参数在方法中调用局部变量值?

来自分类Dev

如何在接口类型的引用上调用Object类的方法?

来自分类Dev

如何在该接口类型的对象上调用实现接口的类中的方法?

来自分类Dev

JVM字节码,如何找到局部变量的类型?

来自分类Dev

调用方法时如何传递所有局部变量

来自分类Dev

如何使方法优先于局部变量

来自分类Dev

如何获取工厂方法的类属性的接口类型

来自分类Dev

Java的10局部变量类型推断的优势?

来自分类Dev

的IntelliJ如何显示在Java中10自动推断局部变量类型提示?

来自分类Dev

当通过引用传递局部变量时,c ++如何处理局部变量的内存?

来自分类Dev

ICollectionView接口类型的变量

来自分类Dev

如何使用作为参数传递给方法的类类型来定义局部变量

来自分类Dev

通过Main()方法访问局部变量

来自分类Dev

接口类型的Java队列

来自分类Dev

返回接口类型的Java方法

来自分类Dev

java.lang.VerifyError:字节码检测后局部变量类型错误

来自分类Dev

在Java中,可以通过多次调用的非静态方法使局部变量为final导致内存泄漏吗?

来自分类Dev

如何通过环境变量覆盖局部变量

来自分类Dev

如何使方法优先于局部变量

来自分类Dev

Return语句无法在方法内部找到局部变量

来自分类Dev

如何在Intellij IDEA中从调用方法中创建默认局部变量?

来自分类Dev

Java ASM - 如何在方法中创建局部变量

Related 相关文章

  1. 1

    在局部变量上调用的Java 8方法引用

  2. 2

    在对象上调用获取方法与将其存储为局部变量(内存占用量,性能)

  3. 3

    如何在堆文件中找到局部变量

  4. 4

    通过反射访问main方法中的局部变量

  5. 5

    如何通过在其他元素上调用上下文来在输入类型“文件”上调用“单击”?

  6. 6

    返回接口类型的Java方法

  7. 7

    java.lang.VerifyError:字节码检测后,局部变量类型错误

  8. 8

    如何通过参数在方法中调用局部变量值?

  9. 9

    如何在接口类型的引用上调用Object类的方法?

  10. 10

    如何在该接口类型的对象上调用实现接口的类中的方法?

  11. 11

    JVM字节码,如何找到局部变量的类型?

  12. 12

    调用方法时如何传递所有局部变量

  13. 13

    如何使方法优先于局部变量

  14. 14

    如何获取工厂方法的类属性的接口类型

  15. 15

    Java的10局部变量类型推断的优势?

  16. 16

    的IntelliJ如何显示在Java中10自动推断局部变量类型提示?

  17. 17

    当通过引用传递局部变量时,c ++如何处理局部变量的内存?

  18. 18

    ICollectionView接口类型的变量

  19. 19

    如何使用作为参数传递给方法的类类型来定义局部变量

  20. 20

    通过Main()方法访问局部变量

  21. 21

    接口类型的Java队列

  22. 22

    返回接口类型的Java方法

  23. 23

    java.lang.VerifyError:字节码检测后局部变量类型错误

  24. 24

    在Java中,可以通过多次调用的非静态方法使局部变量为final导致内存泄漏吗?

  25. 25

    如何通过环境变量覆盖局部变量

  26. 26

    如何使方法优先于局部变量

  27. 27

    Return语句无法在方法内部找到局部变量

  28. 28

    如何在Intellij IDEA中从调用方法中创建默认局部变量?

  29. 29

    Java ASM - 如何在方法中创建局部变量

热门标签

归档