2011-10-13 71 views
9

我正在研究有關Java反射的學校作業。細節如下: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.c中
公共無效Counter.reset()
公共無效Counter.increment()
公共無效Counter.decrement()
公衆最終無效本土java.lang.Object.wait(長)throws java.lang.InterruptedException
public final void java.lang.Object.wait()throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int)throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.la ng.string java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native無效java.lang.Object.notify()
公衆最終無效本土java.lang.Object.notifyAll()

有沒有辦法讓只有不帶參數的那些要打印?首先,我是否正確地解釋了分配細節?或者「沒有指定參數的公共方法」這個短語可能意味着其他的東西,我完全錯誤的想法?

+2

這是一個RTFM分配。這裏是手冊 - http://download.oracle.com/javase/6/docs/api/index.html?java/lang/reflect/package-summary.html。順便說一下,您對作業的解釋是正確的。 – Perception

回答

14

你看過Method類的API嗎?有一種名爲getParameterTypes()的方法,它可以爲您尋找的答案提供答案,並且API明確指出如果沒有參數,它會返回什麼。只需在返回的Methods中的for循環中調用它,就應該像flint一樣。

5

只需使用Method類'getParameterTypes函數。如果返回值爲0,那麼該函數沒有參數。 ()

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

此Method對象

getParameterTypes

公共類[] getParameterTypes:關鍵部分從Java文檔。如果基礎 方法不帶參數,則返回長度爲0的數組。

Returns: 
    the parameter types for the method this object represents 
相關問題