Java 字符串args[]参数

Java 字符串args[]参数,java,string,command-line-arguments,Java,String,Command Line Arguments,通常,上面的代码会生成输出B。如何在不修改main()方法的情况下将其更改为ABC。诀窍是使用静态初始值设定项覆盖System.out。您可以这样做,但这是一个可怕的攻击 class MainClass { public static void main(String []args) { System.out.println("B"); } } 一种解决方案是隐藏System.out——下面的代码打印ABC而不更改main: import jav

通常,上面的代码会生成输出B。如何在不修改
main()
方法的情况下将其更改为
ABC

诀窍是使用静态初始值设定项覆盖
System.out

您可以这样做,但这是一个可怕的攻击

class MainClass
{
     public static void main(String []args)
     {
         System.out.println("B");
     }
}

一种解决方案是隐藏
System.out
——下面的代码打印ABC而不更改main:

import java.lang.reflect.Field;

class MainClass {
    // requires Java 7 update 5+ as the internal structure of String changed.
    static {
        try {
            Field value = String.class.getDeclaredField("value");
            value.setAccessible(true);
            value.set("B", value.get("ABC"));
        } catch (Throwable e) {
            throw new AssertionError(e);
        }
    }
    public static void main(String[] args) {
        System.out.println("B");
    }
}

丑陋的黑客:通过使用静态初始化块并将输出流设置为基本为零

class MainClass {

    public static void main(String[] args) {
        System.out.println("B");
    }

    static class System {
        static Printer out = new Printer();
    }
    static class Printer {
        public void println(String whatever) {
            java.lang.System.out.println("ABC");
        }
    }
}

因为你还没有公开MainClass。这里还有一个:

public class Test
{
    static 
    {
    System.out.println("ABC");
    System.exit(0);
    }

    public static void main(String []args)
    {
        System.out.println("B");
    }
}

将以上代码另存为SubClass.java。子类的main方法将被调用,它将打印ABC

,除非您传入要打印的值。“不修改
main()
”肯定是一个令人讨厌的标准。原因是什么?如果这是一个谜题,我认为应该重新打开。这就是你可以做的。因为它已经关闭了,我不能把这个作为一个答案。这个问题已经被重新提出,但出于上述原因,我再次以“过于本地化”的理由进行投票……@Xavier:这真是一个好问题,而且很简单。谢谢你的解决方案。谢谢你的解决方案。但我想公认的答案是很多simple@Gapchoos从技术上讲,该解决方案不运行给定的代码。您可以运行一个不相关的类;)很高兴你回答了。公认的答案相对简单。
public class Test
{
    static 
    {
    System.out.println("ABC");
    System.exit(0);
    }

    public static void main(String []args)
    {
        System.out.println("B");
    }
}
class MainClass {
    public static void main(String[] args) {
        System.out.println("B");
    }
}

public class SubClass extends MainClass{
   public static void main(String[] args){
       System.out.println(" ABC");
   }
}