Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问Java中静态方法的包含类的类型_Java_Reflection_Static Methods - Fatal编程技术网

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

访问Java中静态方法的包含类的类型,java,reflection,static-methods,Java,Reflection,Static Methods,因此,我正在从头开始编写一个编译器,但在如何确定静态方法是通过哪个类调用的问题上遇到了困难。请看一个例子: public abstract class Token { public TokenType type; public Token() { super(); this.type = TokenType.getInstance(this.getClass()); } public static TokenType type() {

因此,我正在从头开始编写一个编译器,但在如何确定静态方法是通过哪个类调用的问题上遇到了困难。请看一个例子:

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);
  } 
}

如何调用TestToken.type()和TestToken2.type(),并让静态方法知道调用它的方式?具体来说,我需要访问每个类的类对象。这可能吗

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

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

您不会继承静态方法,因此实际上不会调用TestToken.type()或TestToken2.type()。。。只有Token.type()可以工作。您必须以另一种方式注入特定类型

通过最简单的演示(还在Token.java中添加了一个动态方法):

每个方法打印它的位置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
代码:
0:新#2//类令牌
3:dup
4:特别是#3//方法标记。“”:()V
7:调用虚拟4//方法标记。dynamicType:()V
10:新#5//类测试令牌
13:dup
14:特别是#6//方法TestToken。“”:()V
17:invokevirtual#7//方法TestToken.dynamicType:()V
20:invokestatic#8//方法标记。类型:()V
23:invokestatic#9//方法TestToken.type:()V
26:返回

因此,即使在执行TestToken.type()时,类型()也将始终通过令牌调用?是的,其中没有任何帮助。谢谢,刚刚做了一些转储堆栈跟踪的实验,看起来调用的确实是令牌,甚至从未接触过TestToken。谢谢我会找到另一种方法来做我需要的事情。子类型继承静态方法的JLS术语,实际上不是所有成员(“构造函数不是成员”)?是的,但这是在方法分派中处理的。一旦进入该方法,字节码中就不记得分派了。。请参阅更新的答案,来自main的字节码。。
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