gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:11:33 30 4
gpt4 key购买 nike

只是尝试了一下 Java 反射,我想我已经掌握了大部分内容。我从这个了解question/answer在大多数情况下,我仅限于静态变量。不过,如果我有该类的一个实例,我就可以访问非静态变量,这确实有意义,我明白了。

假设我有以下两个类:

public class A
{
private static int _staticInt;

public static void main(String[] args)
{
B instanceOfB = new B();
}
}

public class B
{
private int _nonStaticInt;
public Game() {}
}

我知道如何访问 _staticInt,这不是问题。我的理解是,我可以用相同的方式获取 _nonStaticIntField(即 Field f = B.class.getDeclaredField("_nonStaticInt");)。从其他研究(javadocs、trails 等)中,我了解到我需要 B 的实例才能获得 _nonStaticInt 的值。

所以我的问题;由于 main 是静态的,是否可以访问 instanceOfB 以访问 _nonStaticInt 的值?我不认为这是可能的,但我认为最好在放弃这个想法之前咨询比我更有知识的人。

最佳答案

Since main is static, is it possible to access instanceOfB in order to access the value of _nonStaticInt?

“没有。” Java 反射 API 无法访问局部变量(是否在静态方法中)。反射仅适用于类型级别,不适用于字节码级别2

对链接问题的陈述理解是正确的; 非静态(实例)字段的反射访问在逻辑上需要一个实例。也就是说,问题不是关于反射(reflect) B 类型,问题是关于获取 B 实例(分配给局部变量)以反射(reflect)。

要做到这一点,B 实例必须以某种方式“流血”——例如分配给静态字段或作为参数从 main1 传递给方法/构造函数 - 以便稍后可以将其与反射一起用作要访问实例成员的对象。

最干净的方法可能是通过适当的上下文(或“DI”)向下传递 B 实例,也许在 IoC 的帮助下......并且可能改变类型以避免完全使用反射。


1 “破坏”B 实例的另一种可能方法是附加一个调试器 并在执行框架的主要方法中检查/使用局部变量——但这听起来就像试图用棍子打苍蝇一样。

2 即使像 BCEL/ASM 这样的工具也不会在 main 方法的执行期间立即提供帮助。相反,它将用于解构方法,添加所需的钩子(Hook)/代码以“流血”或使用创建的实例,然后构造修改后的方法来执行。

关于java - 通过反射访问main方法中的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24094298/

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