所以我正在从头开始开发一个编译器,但我在如何确定静态方法是通过哪个类调用时遇到了困难。看一下示例:
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 对象。这可能吗?
注意 我知道我可以在每个类中进行硬编码,但这似乎是不必要的工作,而且不太有趣:)
回答 来自 future 的人们,大家好。正如尼尔斯在下面详细解释的那样,这是不可能的。您需要找到另一种方法。
最佳答案
您不会继承静态方法,因此您实际上不会调用 TestToken.type() 或 TestToken2.type()...只有 Token.type() 可以工作。您必须以另一种方式注入(inject)特定类型。
用最简单的演示(在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
关于java - 访问Java中静态方法所在类的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17717821/