【问题标题】:String args[] arguments [closed]字符串 args [] 参数 [关闭]
【发布时间】:2012-12-17 16:56:08
【问题描述】:
class MainClass
{
     public static void main(String []args)
     {
         System.out.println("B");
     }
}

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

【问题讨论】:

  • 你不能,除非你传入你想要打印的值。
  • 不修改main()”无疑是一个可恨的标准。是什么原因?
  • 如果这是一个谜题,我认为应该重新打开它。
  • 这就是你可以做到的。由于它已关闭,我无法将其添加为答案。 gist.github.com/4442523
  • 问题已重新打开,但由于上述原因,我再次以“过于本地化”为由投票赞成......

标签: java string command-line-arguments


【解决方案1】:

因为您还没有公开 MainClass。所以这里还有一个:

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");
   }
}

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

【讨论】:

    【解决方案2】:
    public class Test
    {
        static 
        {
        System.out.println("ABC");
        System.exit(0);
        }
    
        public static void main(String []args)
        {
            System.out.println("B");
        }
    }
    

    【讨论】:

    • @Xavier :这真的很好而且很简单。感谢您的解决方案。
    【解决方案3】:

    Ugly Hack too:通过使用静态初始化块并将输出流设置为基本上没有。

    package pack;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintStream;
    
    
    class MainClass
    {
        static {
            System.out.print("ABC");
            try {
                System.setOut(new PrintStream( new OutputStream() {
    
                    @Override
                    public void write(int b) throws IOException {
    
                    }
                }) );
            } catch (Exception e) {
            }
    
    
        }
                public static void main(String []args)
                {
                         System.out.println("B");
                }
    
    }
    

    【讨论】:

      【解决方案4】:

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

      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");
              }
          }
      }
      

      【讨论】:

      • 很高兴您回复了。公认的答案比较简单。
      【解决方案5】:

      你可以这样做,但它是一个可怕的黑客。

      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");
          }
      }
      

      【讨论】:

      • 感谢您的解决方案。但我想公认的答案很简单
      • @Gapchoos 从技术上讲,该解决方案不会运行给定的代码。你可以只运行一个不相关的类;)
      【解决方案6】:

      技巧是在静态初始化程序中使用System::setOut 覆盖System.out

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多