我正在做一份关于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 . decimal ()
java.lang.Object.wait(long)抛出java.lang.InterruptedException
java.lang.Object.wait()抛出java.lang.InterruptedException
public final void java.lang.Object.wait(long,int)抛出java.lang.InterruptedException
java.lang.Object.equals(java.lang.Object)
java.lang.Object.toString()
public native int java.lang.Object.hashCode()
java.lang.Object.getClass()
java.lang.Object.notify()
java.lang.Object.notifyAll()
是否有一种方法可以只打印没有参数的那些?另外,我对作业细节的理解是否正确?或者短语"不指定参数的公共方法"可能意味着其他东西,我有完全错误的想法?
您看过Method类的API吗?有一个名为getParameterTypes()的方法,它有您正在寻找的答案,并且API显式地声明如果没有参数,它将返回什么。只要在返回的方法的for循环中调用这个你应该在flint
只使用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
这个方法对象。返回一个长度为0的数组方法不接受任何参数。
Returns: the parameter types for the method this object represents