2011-10-13 18 views
9

Pracuję nad szkolnym przydziałem o refleksji Java. Szczegóły znajdują się poniżej:Java odbicie: Jak uzyskać metody bez parametrów tylko

Napisz program konsoli, który prosi użytkownika o nazwę klasy, ładuje tej klasy i tworzy jej wystąpienie. Zakładamy, że klasa ma konstruktor bez żadnych parametrów. Następnie program wypisze nazwy i wartości publicznych zmiennych utworzonego obiektu, a także także listę publicznych metod, które nie określają parametru. Program powinien pozwolić użytkownikowi wybrać metodę i wykonać tę metodę na obiekcie utworzonym pod . Następnie program powinien ponownie pokazać publiczne zmienne z ich wartościami i pozwolić użytkownikowi wybrać metodę i tak dalej. Użyj następującego klasę do testowania implementacji :

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

Problem mam ma do czynienia z następującym zdaniu: „lista metod publicznych, które nie określają parametr”. Czy istnieje sposób listy tylko metod bez parametrów? Użyłem getMethods, ale w końcu otrzymuję wiele metod od nadklas obiektów i klas z parametrami.

Na przykład następujący kod, który mam napisane:

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(); 
     } 
    } 
} 

wyprowadza następujące:

Co klasa chcesz uruchomić? Licznik
public int Counter.c
public void Counter.reset()
public void Counter.increment()
public void Counter.decrement()
public final void java.lang.Object.wait natywną (długa) wyrzuca java.lang.InterruptedException
public final void java.lang.Object.wait() wyrzuca java.lang.InterruptedException
public final void java.lang.Object.wait (długi, int) wyrzuca java.lang.InterruptedException
public boolean java.lang.Object.equals (java.lang.Object)
public java.la ng.String java.lang.Object.toString()
publicznego rodzimy int java.lang.Object.hashCode()
public final rodzimy java.lang.Class java.lang.Object.getClass()
public final rodzimy unieważnić java.lang.Object.notify()
public final void java.lang.Object.notifyAll (natywną)

Czy istnieje sposób, aby uzyskać tylko te bez parametrów mają być drukowane? Czy moja interpretacja szczegółów zlecenia jest na pierwszym miejscu? A może fraza "publiczne metody, które nie określają parametru" może oznaczać coś innego i mam całkowicie zły pomysł?

+2

To jest przydział RTFM. A oto instrukcja - http://download.oracle.com/javase/6/docs/api/index.html?java/lang/reflect/package-summary.html. Twoja interpretacja zadania jest prawidłowa przy okazji. – Perception

Odpowiedz

14

Czy obejrzałeś API klasy Method? Istnieje metoda o nazwie getParameterTypes(), która ma odpowiedź na to, czego szukasz, a interfejs API wyraźnie stwierdza, co to nastąpi, jeśli nie ma żadnych parametrów. Po prostu wywołaj to w pętli for Metody zwróconej i powinieneś być jak krzemień.

5

Wystarczy użyć funkcji Metoda klasy "getParameterTypes. Jeśli wartość zwracana wynosi 0, wówczas nie ma parametrów dla tej funkcji. Kluczowym elementem z doc Java:

getParameterTypes

publicznych Class [] getParameterTypes()

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

ten obiekt metody. Zwraca tablicę o długości 0, jeśli bazowa metoda nie przyjmuje parametrów.

Powiązane problemy