Java反射:如何仅获取无参数方法

10

我正在完成一项关于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) 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.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
这是一个RTFM作业。这里有手册 - http://download.oracle.com/javase/6/docs/api/index.html?java/lang/reflect/package-summary.html。顺便说一下,你对任务的解释是正确的。 - Perception
2个回答

14

你看过Method类的API吗?有一个叫做getParameterTypes()的方法可以回答你想要的内容,并且API明确说明如果没有参数,它将返回什么。在返回的方法数组上使用for循环调用这个方法,你就可以了解到所有方法的参数类型了。


5

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

getParameterTypes

public Class[] getParameterTypes()

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

this Method object. Returns an array of length 0 if the underlying method takes no parameters.

Returns:
    the parameter types for the method this object represents

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接