V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xpresslink
V2EX  ›  Java

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

  •  
  •   xpresslink · 2019-01-09 13:16:12 +08:00 · 4472 次点击
    这是一个创建于 2147 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教一下 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
    
    
    } 
    

    }

    第 1 条附言  ·  2019-01-09 15:09:49 +08:00
    谢谢 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 条回复    2019-01-09 18:52:32 +08:00
    lihongjie0209
        1
    lihongjie0209  
       2019-01-09 13:29:43 +08:00   ❤️ 10
    少吃

    锻炼括约肌
    guoluwei
        2
    guoluwei  
       2019-01-09 13:36:52 +08:00
    jackchao7432
        3
    jackchao7432  
       2019-01-09 13:39:48 +08:00
    引用传递
    w4ngzhen
        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);
    }
    w4ngzhen
        5
    w4ngzhen  
       2019-01-09 13:47:57 +08:00 via iPhone
    皮了一下,没看到 method 不能用 print😂😂
    xpresslink
        6
    xpresslink  
    OP
       2019-01-09 14:02:42 +08:00
    @w4ngzhen 没关系。我现在也卡住了。😂
    TtTtTtT
        7
    TtTtTtT  
       2019-01-09 14:03:28 +08:00
    Java 不支持多返回值,也没有原生指针。

    所以大概是没有法子了。。
    ech0x
        8
    ech0x  
       2019-01-09 14:05:14 +08:00
    @lihongjie0209 #1 真的笑出声
    amoia50
        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


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

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

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

    3. 然后用某种 native 的方法(类似 unsafe) 修改值 --- 但是怎么做???
    ahao99
        21
    ahao99  
       2019-01-09 14:35:51 +08:00   ❤️ 1
    有个想法,System.out 是个静态对象 PrintStream
    反射修改这个类的 println 方法,不知道是否可以
    5CanTell
        22
    5CanTell  
       2019-01-09 14:39:17 +08:00
    放到包装类里...
    janus77
        23
    janus77  
       2019-01-09 15:13:43 +08:00
    返回一个长度为 2 的数组
    我一般这么干
    ourzhang
        24
    ourzhang  
       2019-01-09 15:28:24 +08:00
    在 method 方法中把重新赋值不就可以了么?
    10 楼不是已经给出答案了么?
    tearslee
        25
    tearslee  
       2019-01-09 15:33:28 +08:00
    @ourzhang java 中 int 与 Integer 不一样,Integer 可以引用传递,int 不行
    DsuineGP
        26
    DsuineGP  
       2019-01-09 16:07:37 +08:00
    com.sun.jdi.StackFrame 直接写栈帧的变量,应该跟 debuger 一个原理
    xpresslink
        27
    xpresslink  
    OP
       2019-01-09 16:12:34 +08:00
    @DsuineGP 嗯,高手啊,就想知道这种真正的 hacker 方法。
    Yiki
        28
    Yiki  
       2019-01-09 16:15:52 +08:00
    我是进来看标题的
    VoidChen
        29
    VoidChen  
       2019-01-09 16:36:23 +08:00
    还有个更无耻的,写个 Lambda 传进去,lambda 里面写 sysout
    mmdsun
        30
    mmdsun  
       2019-01-09 18:52:32 +08:00 via Android
    楼主意思是,通过反射,修改方法中的局部变量?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1034 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:03 · PVG 06:03 · LAX 14:03 · JFK 17:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.