Access 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对象。这可能吗?

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

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

您不会继承静态方法,因此实际上不会调用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

相关内容

  • 没有找到相关文章

最新更新