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 10
少吃
锻炼括约肌 |
2
guoluwei 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 1
有个想法,System.out 是个静态对象 PrintStream
反射修改这个类的 println 方法,不知道是否可以 |
22
5CanTell 2019-01-09 14:39:17 +08:00
放到包装类里...
|
23
janus77 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
楼主意思是,通过反射,修改方法中的局部变量?
|