2013-07-18 2 views
0

Итак, я работаю над компилятором с нуля, но споткнулся о том, как определить, с каким классом был вызван статический метод. Посмотрите на пример:Доступ к типу содержащего класса статического метода в 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 каждого из них. Возможно ли это?

Примечание Я знаю, что я мог бы трудно код в классе каждый, но, похоже, ненужной работы, и как меньше удовольствия :)

Ответ Привет люди из будущего. Как Нильс подробно объясняет ниже, это невозможно. Вам нужно будет найти другой способ.

ответ

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) 

Update:

Добавлено байт-код для отправки метода:

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

Значит, type() всегда вызывался через токен, даже когда TestToken.type()? –

+0

Да, там нет ничего, что могло бы вам помочь. –

+0

Спасибо, просто немного экспериментировал с демпингом трассировки стека, и похоже, что вызов действительно Token, даже не касается TestToken. Благодаря! Я найду другой способ сделать то, что мне нужно. –

Смежные вопросы