class MainClass
{
public static void main(String []args)
{
System.out.println("B");
}
}
通常上述代码生成输出乙。我如何在不修改main()
方法的情况下将其更改为ABC
?字符串ARGS []参数
class MainClass
{
public static void main(String []args)
{
System.out.println("B");
}
}
通常上述代码生成输出乙。我如何在不修改main()
方法的情况下将其更改为ABC
?字符串ARGS []参数
诀窍是在静态初始化器中使用System::setOut
覆盖System.out
。
你可以做到这一点,但它是一个可怕的黑客。
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
@Gapchoos从技术上讲,该解决方案不运行给定的代码。你可以运行一个不相关的课程;) –
一种解决方案是隐藏System.out
- 下面的代码打印ABC而不改变主:
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");
}
}
}
很高兴你回复。被接受的答案比较简单。 – Gapchoos
丑陋的黑客也:通过使用静态初始化块和所述输出流设置为基本上没有什么。
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");
}
}
当你还没有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。子类的主要方法将被调用,将打印ABC。
你不能,除非你传递你想要打印的值。 – duffymo
你不行。你*可以*使用静态初始化器打印“A”,但是对于“C”AFAICS你没有办法做。 –
你为什么要更改代码而不更改代码? –