Отражение Java: как получить методы без параметров - PullRequest
9 голосов
/ 13 октября 2011

Я работаю над школьным заданием о рефлексии Java.Подробности приведены ниже:

Напишите консольную программу, которая запрашивает у пользователя имя класса, загружает этот класс и создает его экземпляр.Мы предполагаем, что класс имеет конструктор без каких-либо параметров.Затем программа выводит имена и значения открытых переменных созданного объекта, а также список открытых методов, которые не указывают параметр.Программа должна позволить пользователю выбрать метод и выполнить этот метод на созданном объекте.После этого программа должна снова показать открытые переменные с их значениями и позволить пользователю выбрать метод и так далее.Используйте следующий класс для проверки вашей реализации:

public class Counter {
    public int c;
    public void increment() { c++; }
    public void decrement() { c--; }
    public void reset() { c = 0; }
}

Проблема, с которой я столкнулся, связана со следующим предложением: «список открытых методов, которые не указывают параметр».Есть ли способ перечислить только методы без параметров?Я использовал getMethods, но в итоге получаю множество методов из суперклассов Object и Class с параметрами.

Например, следующий код, который я написал:

import java.lang.reflect.*;
import java.io.*;

public class Q1 {
    public static void main(String[] args) {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("What class would you like to run? ");
            String className = reader.readLine();

            Class c = Class.forName(className);
            Object o = c.newInstance();

            for (Field f : c.getFields())
                System.out.println(f);
            for (Method m : c.getMethods())
                System.out.println(m);

        } catch(IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

Выводит следующее:

В каком классе вы хотели бы учиться?Counter
public int Counter.c
public void Counter.reset ()
public void Counter.increment ()
public void Counter.decrement ()
public final native void java.lang.Object.wait (long) выбрасывает java.lang.InterruptedException
публичный финальный void java.lang.Object.wait () выбрасывает java.lang.InterruptedException
публичный финальный void java.lang.Object.wait (long, int) бросает java.lang.InterruptedException
публичный логический java.lang.Object.equals (java.lang.Object)
публичный java.lang.String java.lang.Object.toString ()
публичный собственный intjava.lang.Object.hashCode ()
общедоступный финальный нативный java.lang.Class java.lang.Object.getClass ()
публичный окончательный нативный void java.lang.Object.notify ()
публичный финалnative void java.lang.Object.notifyAll ()

Есть ли способ получить только те, без параметров, которые будут напечатаны?Кроме того, правильно ли мое толкование деталей задания?Или фраза «публичные методы, которые не определяют параметр» может означать что-то еще, и я совершенно не прав?

Ответы [ 2 ]

14 голосов
/ 13 октября 2011

Вы смотрели на API для класса Method?Есть метод с именем getParameterTypes () , который отвечает за то, что вы ищете, и API явно указывает, что это будет возвращать, если нет параметров.Просто вызовите это в цикле for для возвращаемых методов, и вы должны быть как кремень.

5 голосов
/ 13 октября 2011

Просто используйте функцию класса класса ' getParameterTypes . Если возвращаемое значение равно 0, то для этой функции нет параметров. Ключевая часть из документа Java:

getParameterTypes

открытый класс [] getParameterTypes ()

Returns an array of Class objects that represent the formal parameter types, in declaration order, of the method represented by

этот метод объекта. Возвращает массив длины 0, если базовый Метод не принимает параметров.

Returns:
    the parameter types for the method this object represents
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...