java - 访问Java中静态方法所在类的类型

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

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

回答 来自 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/

相关文章:

java - 为什么我们在 junit 测试中使用 Mockitojunitrunner 类?

mysql - 为另一个 SELECT 选择列名 - 可能吗?

java - 在 JUnit 中引用私有(private)类

android - 开始一项 Activity 。不能从静态上下文中引用非静态方法

java - Kafka 生产者异常 NoClassDefFoundError

java - 如何从结构上修改 JsonObject 并替换其某些值?

c# - “Safe handle has been closed” 线程中止 : can program crash be avoided?

java - Java中静态方法不支持动态多态的原因

java - 调用静态方法后重用类

java - 使用 Java 字符串替换方法产生与预期不同的结果,为什么?