有没有办法通过Reflection或其他工具来反省 中的方法?
所以,例如:
public void someMethod() {
int one = 1;
int two = 2;
}
并且反省在方法“someMethod”中找到int类型的字段“one”和“two”?据我所知,它在反射中是不可能的,但我希望ASM或其他一些字节码的内部检测工具能够实现。
答案 0 :(得分:0)
字段与方法局部变量的区别在于:
还有另一个问题:在字节代码中,局部变量没有使用与Java源代码中声明的类似方式的显式声明来指定。相反,方法局部变量仅作为特定于方法的变量数组的一部分可见,该变量包含以下顺序的所有以下变量:
static
,则不包括此引用),这是this
引用。此示例中的m
方法:
class A {
void m(Object arg) {
Object o = "test";
}
}
因此,将在字节代码中显示为以下局部变量数组:
[Object (this), Object (arg), Object (o)]
有了这些知识,您可以使用ASM及其MethodVisitor
来解析类的方法。这样做,你可以扣除:
static
,因此您可以删除第一个变量,并留下两个局部变量的可能性。现在你必须解析方法的字节代码,你会发现有一个类型为String
的引用被推入第三个数组点。这将使您发现您声明了一些类型为String
的局部变量或其中一个超类型(如Object
)。
但是,您仍然无法确定此局部变量是否已合成 。由于上述原因。没有更多的东西可以找到你。 (注意long
或double
变量,这些变量的大小为2的变量点。)