2011-12-02 3 views
2

Я работаю с основами отражения Java и наблюдает информацию о методах классов. Мне нужно получить метод, соответствующий спецификациям, описанным функцией getMethod(). Однако, когда я это делаю, я получаю исключение NoSuchMethodException, и я надеялся, что вы скажете мне, почему моя реализация неверна.Java Reflection, getMethod()

static void methodInfo2(String className) throws ClassNotFoundException, 

NoSuchMethodException{ 

     Class cls = null; 
     try{ 
      cls = Class.forName(className); 
     } catch(ClassNotFoundException e){ 
      e.printStackTrace(); 
     } 
     System.out.println("Cls: "+cls); 


     Method method1 = cls.getMethod("test", null); 
     System.out.println("method1: "+method1); 


    } 

EDIT1: Когда я распечатать "Cls:" + ЦБС, выход "Клс: класс a8.myclass2". Почему он добавляет часть класса? (a8 правильно, поэтому не беспокойтесь об этом)/EDIT1

Это функция, которую я использую для чтения в классе из моей основной функции, а затем я хочу getMethod() с параметрами «test» и null, где «test» - это имя метода, а null означает, что метод не имеет параметров. Класс Читаю в называется myclass2, который находится здесь:

package a8; 

public class myclass2 { 

    void test(){ 
     //"takes no parameters" 
     //"returns bool" 
     //"name starts with test" 
     //return true; 
    } 

} 

Как вы можете видеть, метод делает Infact существует в классе. Если бы вы могли указать на мою ошибку, я был бы очень признателен.

ответ

8

Сделайте свой тестовый метод общедоступным. Я считаю, что Class.getMethod() ограничивается общедоступными методами.

+0

Это так, и вы избили меня до него. +1 Из JavaDoc для 'getMethod()': "Возвращает объект Method, который отражает указанный ** открытый метод-член класса или интерфейса, представленный этим объектом класса." –

+0

Спасибо :) Это сработало – Nibirue

3

Не указывая точное исключение и ваш вывод, его трудно сказать, но я подозреваю, что это потому, что классы находятся в двух отдельных пакетах, а поскольку модификаторы по умолчанию для метода - это только protected, он терпит неудачу.

Используйте getDeclaredMethod(), чтобы получить метод, который обычно не отображается.

+0

Нет, они были в одном пакете. Однако ответ выше работал. – Nibirue

+0

Возможно, по умолчанию будет приватно. В любом случае, если вы используете 'getDeclaredMethod()' вы ** можете получить доступ к чему-либо **. – jli

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