Java编程--反射(Ⅳ 调用方法)
五.反射调用方法
类中的普通方法只有在一个类产生实例化对象之后才可以调用。并且实例化对象的方式有三种(new,克隆,反射)。
【范例】定义一个类。
public class Book {
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
这个类有无参构造方法,所以实例化对象的时候可以直接利用Class类中提供的newInstance()方法完成。
在Class类里面提供有以下取得类中Method的操作:
(1)取得一个类中的全部方法:
public Method[] getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。 |
(2)取得指定方法:
public Method getMethod(String name,Class<?>... parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 |
以上的两个操作返回的是java.lang.reflect.Method类对象。在此类中重点关注一个方法:
调用方法:
public Object invoke(Object obj,Object... args) 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 |
【范例】反射调用方法。
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
String fieldName = "title"; // 要操作的成员
Class<?> cls = Class.forName("com.reflect.demo.Book");
Object obj = cls.newInstance(); // 必须给出实例化对象
Method setMethod = cls.getMethod("set" + initcap(fieldName), String.class); // 参数类型String
Method getMethod = cls.getMethod("get" + initcap(fieldName)); // 没有参数
setMethod.invoke(obj, "Java开发"); // 等价于Book类对象.setTitle("Java开发");
System.out.println(getMethod.invoke(obj));
}
// 首字母大写,用于设置get和set方法名称首字母大写,如:setName()
public static String initcap(String str) {
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
}
运行结果:
此时完全看不到具体的操作类型,也就是说利用反射可以实现任意类的指定方法调用。