2016-01-08 9 views
-1

I've получил суперкласс Token с некоторыми подклассами, как Knight, King, Queen и т.д.Java: вызов статического метода из неизвестного класса с polymorphy

мне нужен случайный Token типа, так что я называю этот метод:

public Class randomTokenType(){ 
    Class[] classes ={ Bishop.class, King.class, Knight.class, Pawn.class, Queen.class, Rook.class }; 
    Random random = new Random(); 
    return classes[random.nextInt(6)]; 
} 

Class<Token> tokenType = randomTokenType(); 

теперь я хочу, чтобы вызвать статический метод на этом tokenType, для примера:

tokenType.displayString() 

Компилятор не может решить этот метод, даже жестко его реализовать в Token и всех его подклассах.

В чем моя ошибка?

+0

Как вы думаете, класс 'Class' это? Почему ты так думаешь? Полиморфизм и «статические» противоречивы в Java. –

+0

Кроме того, не добавляйте фрагмент кода javascript для кода Java.Посмотрите в справочном центре, как правильно отредактировать фрагменты кода. –

+0

Im новый на Java извините. Обычно я код в Smalltalk, где даже классы являются объектами. Нет никакой разницы в поведении между «классами» и «объектами». – jesper

ответ

1

То, что вы на самом деле ищете является отражением - см Invoking a static method using reflection

в вас случай, который был бы:

Method method = tokenType.getMethod("displayString"); 
method.invoke(null); 

Класс-объект является своего рода показателем. Он содержит методы, которые позволяют вам запрашивать то, что содержит фактический файл .class (например, его методы, поля, аннотации и др.).

Вы не можете получить доступ к ним непосредственно (подобно точкам индекса только где информация - не сама информация) - вместо этого вам нужно запросить индекс с т Class.getMethod («nameofMethod»)

как только вы получил «указатель» на метод, который вы можете попытаться назвать (через Method.invoke).

В зависимости от метода, вам необходимо передать метод invoke только null (для статических методов) или экземпляр объекта (для нестатического).

Отражение позволяет создать такой экземпляр на лету.

Для получения дополнительной информации я предлагаю прочитать рефлексию и особенно javadoc класса. Это объясняет многое.

Edit: это работает только если метод DisplayString объявляется следующим образом:

public class Bishop{ 
    public static void displayString() { 
     System.out.println("Bishop"); 
    } 
} 

public class Test { 
public static void main(String args[]) throws Exception { 
    Class<?> tokenType = Bishop.class; 
    Method method = tokenType.getMethod("displayString"); 
    method.invoke(null); 
} 
} 

если есть параметр или частная, то это не будет работать

+0

Уже пробовал. Я получаю исключение NoSuchMethodException. То же самое с '.getDeclaredMethod' – jesper

+0

вопрос в том, является ли метод общедоступным. Я просто попробовал это: public class Bishop { \t public static void displayString() { \t \t System.out.println ("Bishop"); \t} } – Niko

0

Есть немало проблем, с ваш код. Немногие из них:

  • Вы просите класс вернуть что-то.

    public Class randomTokenType() // Не знаете, что это означает?

  • При добавлении статического определения метода этот метод не может быть overrriden

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

  • Нет связанных вопросов^_^