所以我从头开始编写一个编译器,但是我在如何找出一个静态方法被调用的方法上遇到了麻烦。看看这个例子:
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);
}
}
如果我有两个继承自Token的类
public class TestToken extends Token {
public TestToken() {
super()
}
}
和
public class TestToken2 extends Token {
public TestToken2() {
super()
}
}
如何调用TestToken.type()和TestToken2.type(),并知道调用它的静态方法?具体来说,我需要访问每个的Class对象。这甚至可能吗?
注意 我知道我可以在每个类的硬编码,但这似乎是不必要的工作,并没有那么有趣:)
答案 你好,以后的人。正如Niels在下面详细解释的那样,这是不可能的。你需要找到另一种方式。
答案 0 :(得分: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();
}}
每个方法在哪里打印stacktrace:
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