2011-10-13 10 views
9

que estoy trabajando en una asignación de escuela sobre la reflexión de Java. Los detalles son a continuación:Java reflexión: ¿Cómo obtener métodos sin parámetros sólo

Escribir un programa de consola que pide al usuario un nombre de clase, cargas esa clase y crea una instancia del mismo. Suponemos que la clase tiene un constructor sin ningún parámetro. A continuación, el programa imprime los nombres y valores de las variables públicas del objeto creado, y también una lista de los métodos públicos que no especifican un parámetro. El programa debe permitir al usuario elegir un método y ejecutar ese método en el objeto creado. Posteriormente, el programa debe mostrar de nuevo las variables públicas con sus valores y permitir al usuario elegir un método , y así sucesivamente. Utilice la siguiente clase para probar su aplicación :

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

El problema que estoy teniendo tiene que ver con la siguiente frase: "lista de los métodos públicos que no especifican un parámetro". ¿Hay alguna manera de enumerar solo los métodos sin parámetros? He usado getMethods pero termino obteniendo muchos métodos de las superclases Object y Class con parámetros.

Por ejemplo el siguiente código que he escrito:

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

da el siguiente resultado:

Qué clase le gustaría correr? Contador
public int Counter.c
public void Counter.reset()
public void Counter.increment()
public void Counter.decrement()
pública final java.lang.Object.wait native void (larga) throws java.lang.InterruptedException
public void final java.lang.Object.wait() throws java.lang.InterruptedException
public void final java.lang.Object.wait (long, int) throws java.lang.InterruptedException
java.lang.Object.equals booleanos públicos (java.lang.Object)
java.la pública ng.String java.lang.Object.toString()
public int java.lang.Object.hashCode nativa()
pública final nativa java.lang.Class java.lang.Object.getClass()
nativa public final java.lang.Object.notify anular()
java.lang.Object.notifyAll pública final nativa vacío()

¿hay una manera de obtener sólo los que tienen no hay parámetros para ser impreso? También es mi interpretación de los detalles de la asignación en primer lugar? ¿O la frase "métodos públicos que no especifican un parámetro" posiblemente significa algo más y tengo una idea completamente equivocada?

+2

Esta es una asignación RTFM. Y aquí está el manual: http://download.oracle.com/javase/6/docs/api/index.html?java/lang/reflect/package-summary.html. Por cierto, tu interpretación de la tarea es correcta. – Perception

Respuesta

14

¿Has mirado en la API para la clase Método? Hay un método llamado getParameterTypes() que tiene la respuesta para lo que estás buscando, y la API establece explícitamente qué devolverá si no hay parámetros. Solo llámalo en tu bucle for en los métodos devueltos y deberías estar como el pedernal.

5

Simplemente use la clase de método 'getParameterTypes función. Si el valor de retorno es 0, entonces no hay parámetros para esa función. parte clave del documento de Java:

getParameterTypes

getParameterTypes públicas Class []()

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

este método objeto. Devuelve una matriz de longitud 0 si el método subyacente no toma ningún parámetro.

Returns: 
    the parameter types for the method this object represents 
Cuestiones relacionadas