gpt4 book ai didi

javassist - 使用 Javassist 获取方法参数的名称

转载 作者:行者123 更新时间:2023-12-04 22:12:50 28 4
gpt4 key购买 nike

我有一个 CtMethod实例,但我不知道如何从中获取参数(不是类型)的名称。我试过 getParameterTypes ,但它似乎只返回类型。

我假设这是可能的,因为我使用的库没有源,只有类文件,我可以在 IDE 中看到方法参数的名称。

最佳答案

确实可以检索参数的名称,但前提是代码已使用调试符号编译,否则您将无法执行此操作。

要检索此信息,您必须访问该方法的局部变量表。有关此数据结构的更多信息,我建议您查看 4.7.13. The LocalVariableTable Attribute 部分的jvm spec .正如我通常所说的,JVM 规范可能看起来很笨重,但是当您在这个级别工作时,它是非常宝贵的 friend !

访问 ctmethod 的局部变量表属性

  CtMethod method = .....;
MethodInfo methodInfo = method.getMethodInfo();
LocalVariableAttribute table = methodInfo.getCodeAttribute().getAttribute(javassist.bytecode.LocalVariableAttribute.tag);

您现在已在 table 中选择了局部变量属性。多变的。

检测localVariables的数量
   int numberOfLocalVariables = table.tableLenght(); 

现在请记住关于 numberOfLocalVariables 中的数字的两件事:
  • 第一 :在方法体内定义的局部变量也将在 tableLength() 中计算;
  • 第二 :如果您使用的是非静态方法,那么 this多变的。

  • 您的局部变量表的顺序将类似于:
    |this (if non static) | arg1 | arg2 | ... | argN | var1 | ... | varN|
    检索参数名称

    现在,例如,如果您想从上一个示例中检索 arg2 的名称,则它是数组中的第 3 个位置。因此,您执行以下操作:
     // remember it's an array so it starts in 0, meaning if you want position 3 => use index 2
    int frameWithNameAtConstantPool = table.nameIndex(2);
    String variableName = methodInfo.getConstPool().getUtf8Info(frameAtConstantPool)

    现在您的变量名称在 variableName 中.

    旁注 :我已经带你走过风景优美的路线,所以你可以了解更多关于 Java(和 javassists)内部的知识。但是已经有工具可以为你做这种操作,我记得至少有一个叫 paranamer的工具。 .你可能也想看看。

    希望有帮助!

    关于javassist - 使用 Javassist 获取方法参数的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20316965/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com