C#如何从其他类的void方法中获取参数变量?
如何在外部类获取MyClass中void方法内的随机number值?
嘿,这个问题挺接地气的!咱们先把场景明确下——假设你的MyClass里的myVoid方法大概是这样的:
public class MyClass { public void myVoid() { int number = new Random().nextInt(); // 方法内部的随机局部变量 // 其他业务逻辑... } }
你想在另一个类里拿到这个number的值,还不能给MyClass新增任何成员变量,对吧?那咱们分情况说:
常规合法手段:不行
如果只靠Java的基础语法和常规API,你没办法直接获取到这个number。因为它是方法内部的局部变量,作用域只限于myVoid方法执行的那段时间,方法执行完毕后,这个变量就会被JVM的垃圾回收机制处理掉,外部类没有任何直接访问它的途径——毕竟你还不能给MyClass加成员变量来暂存它。
非常规"黑科技"手段:可以,但极度不推荐
如果你硬要实现,也不是完全没招,但这些方法都属于剑走偏锋,生产环境绝对不建议用:
- 反射读取栈帧:通过反射API获取当前线程的栈帧,再读取方法的局部变量表。但这种方式完全依赖JVM的具体实现,不同版本、不同厂商的JVM可能有差异,代码脆弱得一批,而且很容易出问题。
- 字节码修改:用ASM、Javassist这类字节码操作库,在运行时修改
myVoid的字节码,把number的值传递到外部类。这同样属于非常规操作,会大幅增加代码的复杂度和维护成本,还可能破坏原有方法的逻辑。
更合理的替代方案(推荐)
如果允许你修改myVoid方法的实现(只是不能给MyClass加成员变量),其实有两种非常靠谱的方式:
- 调整方法返回值:把
void改成返回int,直接返回number。不过如果方法原本就有其他设计意图,这种方式可能不太合适。 - 使用回调函数:给
myVoid方法加一个回调参数,在方法内部把number传给回调,外部类通过回调获取值:
这种方式既不用给// 修改后的MyClass public class MyClass { public void myVoid(Consumer<Integer> numberCallback) { int number = new Random().nextInt(); numberCallback.accept(number); // 把number传递给外部 // 原来的业务逻辑... } } // 外部类调用 public class AnotherClass { public static void main(String[] args) { MyClass myObj = new MyClass(); myObj.myVoid(number -> { // 这里就能拿到随机生成的number了 System.out.println("获取到的number:" + number); }); } }MyClass加成员变量,又能合法、安全地拿到number的值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Pow Mert
相关产品推荐
相关产品推荐

