所以我从头开始就在开发编译器,但在如何弄清楚静态方法是通过哪个类调用的问题上遇到了麻烦。看看这个例子:
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对象。这可能吗?
注意我知道我可以在每个类中硬编码,但这似乎是不必要的工作,而且不太有趣:)
答案来自未来的人们好。正如尼尔斯在下文中彻底解释的那样,这是不可能的。你需要找到另一种方法。
您不会继承静态方法,因此实际上不会调用TestToken.type()或TestToken2.type()…只有Token.ttype()才能工作。您必须以另一种方式注入特定类型。
用最简单的演示(在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