public class Test {
public static void main(String[] args) {
int a,b; a=4; b=5; method(a,b); System.out.println("a="+ a +" b=" + b); // a=400 b=500 }
}
1 lihongjie0209 2019-01-09 13:29:43 +08:00 ![]() 少吃 锻炼括约肌 |
2 abai 2019-01-09 13:36:52 +08:00 @lihongjie0209 +1 |
![]() | 3 jackchao7432 2019-01-09 13:39:48 +08:00 引用传递 |
![]() | 4 w4ngzhen 2019-01-09 13:46:19 +08:00 via iPhone static void method(int a, int b) { System.out.println("a = 400, b = 500"); System.exit(0); } |
![]() | 5 w4ngzhen 2019-01-09 13:47:57 +08:00 via iPhone 皮了一下,没看到 method 不能用 print |
6 xpresslink OP @w4ngzhen 没关系。我现在也卡住了。 |
7 TtTtTtT 2019-01-09 14:03:28 +08:00 Java 不支持多返回值,也没有原生指针。 所以大概是没有法子了。。 |
![]() | 8 ech0x 2019-01-09 14:05:14 +08:00 @lihongjie0209 #1 真的笑出声 |
![]() | 9 amoia50 2019-01-09 14:08:17 +08:00 public class Test { public static void main(String[] args) { Integer a; b; a=4; b=5; method(a,b); System.out.println("a="+ a +" b=" + b); // a=400 b=500 } } |
![]() | 10 amoia50 2019-01-09 14:12:02 +08:00 public class Test { public static void main(String[] args) { Integer a = 4; Integer b = 5; method(a,b); System.out.println("a="+ a +" b=" + b); } public static void method(Integer a, Integer b){ a = 400; b = 500; } } |
11 xpresslink OP @amoia50 这个简单用反射就可以了。我就想问 int |
12 zhenjiachen 2019-01-09 14:14:25 +08:00 <script src="https://gist.github.com/chenzhenjia/e8a3456c9ac35c3eb6b6b980e9789609.js"></script> |
13 wxkvEX 2019-01-09 14:15:40 +08:00 如果 a 和 b 可以声明为 Integer 类型,那么 method 里 面用反射可以实现对值的修改。 基本类型束手无策,坐等大神演示,我觉得可能性很小。 另外楼上是来搞笑的么…… |
![]() | 14 yukiww233 2019-01-09 14:17:00 +08:00 System.out.write("a = 400, b = 500\n".getBytes()); System.exit(0); |
![]() | 15 kaleidoscope 2019-01-09 14:17:21 +08:00 包装类的时候可以 不是的话不知道了。。 |
![]() | 17 tearslee 2019-01-09 14:24:25 +08:00 java 的基本数据类型不能够引用传递 |
![]() | 18 rizon 2019-01-09 14:31:30 +08:00 最常用的就是数组了 ```java int[] a=[5]; int[] b=[6]; void method(int[] a,int[] b){ a[0]=6; b[0]=5; } print(a,b); ``` |
20 Raymon111111 2019-01-09 14:35:21 +08:00 因为 method 和 main 还同属一个线程(thread) 1. 理论上应该是可以在当前线程拿到栈信息(stack) --- 但是怎么做? 2. 回推 a 和 b 在哪 --- 但是怎么做?? 3. 然后用某种 native 的方法(类似 unsafe) 修改值 --- 但是怎么做??? |
21 ahao99 2019-01-09 14:35:51 +08:00 ![]() 有个想法,System.out 是个静态对象 PrintStream 反射修改这个类的 println 方法,不知道是否可以 |
![]() | 22 5CanTell 2019-01-09 14:39:17 +08:00 放到包装类里... |
![]() | 23 rb6221 2019-01-09 15:13:43 +08:00 返回一个长度为 2 的数组 我一般这么干 |
24 ourzhang 2019-01-09 15:28:24 +08:00 在 method 方法中把重新赋值不就可以了么? 10 楼不是已经给出答案了么? |
26 DsuineGP 2019-01-09 16:07:37 +08:00 com.sun.jdi.StackFrame 直接写栈帧的变量,应该跟 debuger 一个原理 |
27 xpresslink OP @DsuineGP 嗯,高手啊,就想知道这种真正的 hacker 方法。 |
![]() | 28 Yiki 2019-01-09 16:15:52 +08:00 我是进来看标题的 |
![]() | 29 VoidChen 2019-01-09 16:36:23 +08:00 还有个更无耻的,写个 Lambda 传进去,lambda 里面写 sysout |
![]() | 30 mmdsun 2019-01-09 18:52:32 +08:00 via Android 楼主意思是,通过反射,修改方法中的局部变量? |