xpresslink
V2EX  ›  Java

请教一下 Java 高手们,可以修改其它方法中的菊部便量么?

  •  
  •   xpresslink · Jan 9, 2019 · 5769 views
    This topic created in 2855 days ago, the information mentioned may be changed or developed.

    请教一下 java 高手们,写出 method 方法使输出 a=400 b=500 , 如果 method 中不准许使用 print 能实现么?

    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
    
    
    } 
    

    }

    Supplement 1  ·  Jan 9, 2019
    谢谢 21 楼,用个无耻的方法实现了

    public class FooTest {

    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
    }

    static void method(int a, int b){
    java.io.PrintStream ps = new java.io.PrintStream(System.out) {
    @Override
    public void println(String x){
    if (x.startsWith("a")){
    super.println("a=400 b=500");
    }}};
    System.setOut(ps);
    }
    30 replies  •  2019-01-09 18:52:32 +08:00
    lihongjie0209
    lihongjie0209
    Jan 9, 2019❤️10
    1
    少吃

    锻炼括约肌
    abai
    abai
    Jan 9, 2019
    2
    jackchao7432
    jackchao7432
    Jan 9, 2019
    3
    引用传递
    zhenwang
    zhenwang
    Jan 9, 2019 via iPhone
    4
    static void method(int a, int b) {
    System.out.println("a = 400, b = 500");
    System.exit(0);
    }
    zhenwang
    zhenwang
    Jan 9, 2019 via iPhone
    5
    皮了一下,没看到 method 不能用 print😂😂
    xpresslink
    xpresslink
    OP
    Jan 9, 2019
    6
    @w4ngzhen 没关系。我现在也卡住了。😂
    TtTtTtT
    TtTtTtT
    Jan 9, 2019
    7
    Java 不支持多返回值,也没有原生指针。

    所以大概是没有法子了。。
    ech0x
    ech0x
    Jan 9, 2019
    8
    @lihongjie0209 #1 真的笑出声
    amoia50
    amoia50
    Jan 9, 2019
    9
    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


    }
    }
    amoia50
    amoia50
    Jan 9, 2019
    10
    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;
    }
    }
    xpresslink
    xpresslink
    OP
    Jan 9, 2019
    11
    @amoia50 这个简单用反射就可以了。我就想问 int
    ce233
    ce233
    Jan 9, 2019
    13
    如果 a 和 b 可以声明为 Integer 类型,那么 method 里 面用反射可以实现对值的修改。
    基本类型束手无策,坐等大神演示,我觉得可能性很小。
    另外楼上是来搞笑的么……
    yukiww233
    yukiww233
    Jan 9, 2019
    14
    System.out.write("a = 400, b = 500\n".getBytes()); System.exit(0);
    kaleidoscope
    kaleidoscope
    Jan 9, 2019
    15
    包装类的时候可以 不是的话不知道了。。
    nycbdwss
    nycbdwss
    Jan 9, 2019
    16
    @amoia50 method ()里面的 a 跟 b 是值又不是引用,怎么改都影响不了原来的 a 跟 b 吧
    tearslee
    tearslee
    Jan 9, 2019
    17
    java 的基本数据类型不能够引用传递
    rizon
    rizon
    Jan 9, 2019
    18
    最常用的就是数组了

    ```java
    int[] a=[5];
    int[] b=[6];

    void method(int[] a,int[] b){
    a[0]=6;
    b[0]=5;
    }
    print(a,b);

    ```
    amoia50
    amoia50
    Jan 9, 2019
    19
    @nycbdwss 自己想的太简单了,哈哈
    Raymon111111
    Raymon111111
    Jan 9, 2019
    20
    因为 method 和 main 还同属一个线程(thread)
    1. 理论上应该是可以在当前线程拿到栈信息(stack) --- 但是怎么做?

    2. 回推 a 和 b 在哪 --- 但是怎么做??

    3. 然后用某种 native 的方法(类似 unsafe) 修改值 --- 但是怎么做???
    ahao99
    ahao99
    Jan 9, 2019❤️1
    21
    有个想法,System.out 是个静态对象 PrintStream
    反射修改这个类的 println 方法,不知道是否可以
    5CanTell
    5CanTell
    Jan 9, 2019
    22
    放到包装类里...
    rb6221
    rb6221
    Jan 9, 2019
    23
    返回一个长度为 2 的数组
    我一般这么干
    ourzhang
    ourzhang
    Jan 9, 2019
    24
    在 method 方法中把重新赋值不就可以了么?
    10 楼不是已经给出答案了么?
    tearslee
    tearslee
    Jan 9, 2019
    25
    @ourzhang java 中 int 与 Integer 不一样,Integer 可以引用传递,int 不行
    DsuineGP
    DsuineGP
    Jan 9, 2019
    26
    com.sun.jdi.StackFrame 直接写栈帧的变量,应该跟 debuger 一个原理
    xpresslink
    xpresslink
    OP
    Jan 9, 2019
    27
    @DsuineGP 嗯,高手啊,就想知道这种真正的 hacker 方法。
    Yiki
    Yiki
    Jan 9, 2019
    28
    我是进来看标题的
    VoidChen
    VoidChen
    Jan 9, 2019
    29
    还有个更无耻的,写个 Lambda 传进去,lambda 里面写 sysout
    mmdsun
    mmdsun
    Jan 9, 2019 via Android
    30
    楼主意思是,通过反射,修改方法中的局部变量?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4182 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 56ms · UTC 05:37 · PVG 13:37 · LAX 21:37 · JFK 00:37
    ♥ Do have faith in what you're doing.