访问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