Java反射:如何获取不带参数的方法

时间:2011-10-13 13:40:29

标签: java reflection

我正在从事关于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();
        }
    }
}

输出以下内容:

  

你想上什么课?计数器
  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)throws java.lang.InterruptedException
  public final void java.lang.Object.wait()抛出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.lang.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 void java.lang.Object.notify()
  public final native void java.lang.Object.notifyAll()

有没有办法只获得没有参数的打印?我首先对作业细节的解释是什么?或者,“没有指定参数的公共方法”这个短语可能意味着什么,我的想法完全错误了?

2 个答案:

答案 0 :(得分:14)

您是否查看过Method类的API?有一个名为getParameterTypes()的方法可以为您所寻找的内容提供答案,并且API明确说明如果没有参数,它将返回什么。只需在返回的方法的for循环中调用它,你就应该像flint一样。

答案 1 :(得分:5)

只需使用Method类'getParameterTypes函数即可。如果返回值为0,则该函数没有参数。 Java doc的关键部分:

  

<强> getParameterTypes

     

public Class [] getParameterTypes()

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

此Method对象。如果是底层的,则返回长度为0的数组   方法没有参数。

Returns:
    the parameter types for the method this object represents