在“租车系统”中,编写过一个驾驶员(租车者)Driver类,这个类有一个callShow(Vehicle v)方法,输入参数类型为Vehicle,通过这个方法显示指定车辆的信息。改造一下之前的代码,将Driver类作为程序入口类,具体代码如下:
很显然,程序员在编码时就已经确定Driver类的callShow(Vehicle v)方法,输入参数类型为Vehicle,在该方法内部,调用Vehicle类的show()方法,显示车辆信息。但是,如果在编译的时候并不知道传入参数的类型是什么,这时候就需要使用反射机制。
import java.lang.reflect.*;
import com.bd.zuche.*;
class TestRef
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
String cName = input.next();
showMethods(cName);
}
public static void showMethods(String name)
{
try{
Class c = Class.forName(name);
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
{
System.out.println(m[i].toString());
}
}catch (Exception e){
e.printStackTrace();
}
}
编译、运行程序,在运行时分别输入java.lang.Object和com.bd.zuche.Car,运行结果如图5.1和图5.2所示,图中列出了Object类和Car类的所有方法。
图5.2 Car类的所有方法
作为程序员,编写简单的Java程序时,使用反射机制的机会不多。反射机制一般在框架中使用较多,因为框架要适用更多的情况,对灵活性要求较高,而反射机制正好能解决这种灵活性要求。