访问Java中静态方法的包含类的类型

时间:2013-07-18 07:57:41

标签: java reflection static-methods

所以我从头开始编写一个编译器,但是我在如何找出一个静态方法被调用的方法上遇到了麻烦。看看这个例子:

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在下面详细解释的那样,这是不可能的。你需要找到另一种方式。

1 个答案:

答案 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