在Class类中定义有如下两个方法:
- 取得全部方法:public Method[] getMethods();
- 取得指定的方法:public Method getMothod(String name,Object ...)
import java.lang.reflect.Method;
/**
* 这是核心模型,在以后的开发中经常用到该模型。
* 通过反射类实例化对象,然后通过Object类型进行所有类的方法调用。
* 在这里用到的方法是getMethod()和invoke()方法
* @author Administrator
*
*/
class Person1111{
private String name;
private int age ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Class_reflact {
public static void main(String[] args) throws Exception {
String attribute = "name";//设置属性值,首字母必须大写
String value = "hello";//设置setName的值为hello
Class<?> cls = Class.forName("反射.Person");//通过Class类模型,获取Class类的对象,并没有实例化
Object obj = cls.newInstance();//通过反射实例化对象
//通过getMethod方法类获取所有的方法,"set"+setName(attribute)等价于setName,而setName的属性是String类型.
//通过getMethod()方法获取setName()方法
Method setMethod = cls.getMethod("set"+setName(attribute), String.class);
//System.out.println(setMethod);
//相当于Person对象,setName(String value);
//获取到了setName()方法,接下来通过invoke()方法设置值,在所有的类中,都要实例化对象,所以传参数obj.
setMethod.invoke(obj,value);
//通过getMethod方法类获取所有的方法
Method getMethod = cls.getMethod("get"+setName(attribute));//getName()
System.out.println(getMethod);
//相当于Person对象,setName(String value);
Object invoke = getMethod.invoke(obj);//obj实例化对象
System.out.println(invoke);
}
public static String setName(String name){
return name.substring(0, 1).toUpperCase()+name.substring(1);//将第一个字母大写,其余的字母小写
}
}
在java.lang.reflect.method中,提供了一个invoke(Object obj)方法调用支持。对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。