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你沒有辦法做。 –
你爲什麼要更改代碼而不更改代碼? –