2013-07-18 119 views
0

因此,我正在從頭開始編譯編譯器,但是在如何確定通過靜態方法調用哪個類方面陷入困境。看看這個例子:訪問Java中靜態方法的包含類的類型

public abstract class Token { 

public TokenType type; 

    public Token() { 
     super(); 
     this.type = TokenType.getInstance(this.getClass()); 
    } 
    public static TokenType type() { 
     Class<? extends Token> t = null; //WHAT SHOULD GO HERE 
     return TokenType.getInstance(t); 
    } 
} 

如果我再有,從令牌

public class TestToken extends Token { 
    public TestToken() { 
    super() 
    } 
} 

繼承兩個階級,

public class TestToken2 extends Token { 
    public TestToken2() { 
    super() 
    } 
} 

我如何調用TestToken.type()和TestToken2 .type(),並通過它被稱爲靜態方法知道?具體來說,我需要訪問每個的Class對象。這甚至有可能嗎?

注意 我知道我可以硬編碼類中的每個的,但是,似乎是不必要的工作,像樂趣卻少了:)

回答 你好的人從未來。正如尼爾斯在下面詳細解釋的那樣,這是不可能的。你需要找到另一種方式。

回答

1

你不會繼承靜態方法,所以你實際上不會調用TestToken.type()和TestToken2.type()...只有Token.type()可以工作。您將不得不以另一種方式注入特定類型。

用最簡單的演示(有也加入Token.java動態方法):

public class Main { 
public static void main(String[] args) { 
    new Token().dynamicType(); 
    new TestToken().dynamicType(); 

    Token.type(); 
    TestToken.type(); 

}} 

其中每一種方法把它打印堆棧跟蹤:

Hello Dynamic world 
java.lang.Exception 
    at Token.dynamicType(Token.java:4) 
    at Main.main(Main.java:3) 
Hello Dynamic world 
java.lang.Exception 
    at Token.dynamicType(Token.java:4) 
    at Main.main(Main.java:4) 
Hello Static world 
java.lang.Exception 
    at Token.type(Token.java:3) 
    at Main.main(Main.java:6) 
Hello Static world 
java.lang.Exception 
    at Token.type(Token.java:3) 
    at Main.main(Main.java:7) 

更新:

添加方法調度字節碼:

Code: 
0: new #2; //class Token 
3: dup 
4: invokespecial #3; //Method Token."<init>":()V 
7: invokevirtual #4; //Method Token.dynamicType:()V 
10: new #5; //class TestToken 
13: dup 
14: invokespecial #6; //Method TestToken."<init>":()V 
17: invokevirtual #7; //Method TestToken.dynamicType:()V 
20: invokestatic #8; //Method Token.type:()V 
23: invokestatic #9; //Method TestToken.type:()V 
26: return 
+0

因此,即使在執行TestToken.type()時,type()也會始終通過Token調用? –

+0

是的,沒有任何東西可以幫助你。 –

+0

謝謝,只是做了一些轉儲堆棧跟蹤的試驗,看起來這個調用確實是給Token的,甚至沒有碰到TestToken。謝謝!我會找到另一種方式來做我所需要的。 –