2013-07-18 75 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。谢谢!我会找到另一种方式来做我所需要的。 –