Java 字符串args[]参数
通常,上面的代码会生成输出B。如何在不修改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
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");
}
}