2015-04-17 3 views
1

Хорошо, не уверен, что происходит. Я использую Java Reflection и итерацию и проверку методов определенного класса. Ниже приведена следующий код, я использую:Почему я получаю дополнительный материал при переходе через методы?

public void test(){ 

    Class useCases = Car.class; 

    Method[] methods = useCases.getMethods(); 
    Integer[] numbers = {2, 5}; 
    String[] numberStrings = {"2", "5"}; 
    for(int i=0; i<methods.length; i++){ 
     try { 
      System.out.print(methods[i].getName()); 
      Method method = useCases.getMethod(methods[i].getName(), new Class[]{String.class, Integer.class}); 
      Object returnV = method.invoke(new Car(), numberStrings[i], numbers[i]); 
      System.out.print(returnV.toString() + "\n"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

автомобили класс:

public String getNumber(String number, Integer times){ 
    return times == 2 ? number : null; 
} 

public String getNumber1(String number, Integer times){ 
    return times == 5 ? number : null; 
} 

Он перебирает тонкую печать из первых двух методов и возвращаемое значение штрафа, но затем он продолжает и печатает ждать() и не знаю, почему, и я получаю следующее сообщение об ошибке:

java.lang.NoSuchMethodException: sample.Car.wait(java.lang.String, java.lang.Integer)

Любая помощь, почему цикл не заканчивается только с печатью и возвращает значения для двух единственных методов в этой машине с деваха.

+0

Почему вы делаете 'Метод method = useCases.getMethod (методы [i] .getName(), новый класс [] {String.class, Integer.class});' просто для возврата 'методов [i]' ? –

+0

То, что я предоставил, не то, что я использую в производстве. Я просто практикую, так как я только начинаю использовать этот метод. – user2474976

+0

Достаточно справедливо. Удачи с ним - отражение действительно круто. –

ответ

5

getMethods возвращает все публичные методы, доступная для класса, в том числе тех, унаследованные как wait()toString(), которые, как вы видите, не принимаете (String, Integer) аргументов, поэтому

useCases.getMethod(methods[i].getName(), new Class[]{String.class, Integer.class}); 

не в состоянии найти wait(String, Integer).

Чтобы получить только методы, объявленные в Car, используйте класс getDeclaredMethods.

КСТАТИ: вместо

System.out.print(returnV.toString() + "\n"); 

, который бросит NullPointerException на returnV.toString() если returnV будет null использование

System.out.println(returnV); // also you don't need to explicitly add `\n`, 
          // use println will add used by current OS line 
          // separator for you automatically 
+0

Большое спасибо - работал как шарм! – user2474976

+0

Добро пожаловать :) – Pshemo

+0

Спасибо. Да, это просто практика, я не использую это для чего-либо реального, по крайней мере, не того, что я предоставлял. Но это тот момент, который я буду помнить. спасибо – user2474976

2

Каждый класс неявно расширения объекта, так что вы получите все методы, содержащие в Object слишком ,

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