0

因此,我正在从头开始研究编译器,但在如何确定调用静态方法的类时遇到了困难。看一下这个例子:

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(),并让静态方法知道它是通过哪个调用的?具体来说,我需要访问每个类的对象。这甚至可能吗?

请注意 ,我知道我可以在每个类中硬编码,但这似乎是不必要的工作,而且不那么有趣:)

回答 来自未来的人们你好。正如尼尔斯在下面彻底解释的那样,这是不可能的。你需要找到另一种方法。

4

1 回答 1

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
于 2013-07-18T08:01:07.353 回答