一、反射机制调用指定方法
通过反射,调用类中的方法,通过Method类完成。步骤:
1.通过Class类的getMethod(String name,Class...parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。
2.之后使用Object invoke(Object obj,Object[] args)进行调用,并向方法中传递要设置的obj对象的参数信息。
packageday19;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;public classTest1 {public static voidmain(String[] args){try{
Class clazz= Class.forName("day19.Student");/*** 注意:下面不论是反射调用setInfo方法,还是test方法,都是调用的obj对象的方法,obj对象实际上就是student对象
**/Constructor con= clazz.getConstructor();//获取无参构造
Object obj = con.newInstance();//使用无参构造创建对象//如果想要调用一个公有的方法
Method m = clazz.getMethod("setInfo", String.class,String.class);//得到名称叫setInfo,参数是String,String的方法
m.invoke(obj, "张三","第一中学");//参数1是需要实例化的对象,参数2是调用当前的方法的实际参数//如果想要调用一个私有的方法
Method m1 = clazz.getDeclaredMethod("test", String.class);//获取方法名为test,参数为一个String类型的方法
m1.setAccessible(true);//解除私有的封装,下面可以强制调用私有方法
m1.invoke(obj, "李四");//调用一个重载方法
Method m2 = clazz.getMethod("setInfo", int.class);//setInfo的重载方法
m2.invoke(obj, 10);//参数1是需要实例化的对象,参数2是调用当前的方法的实际参数//调用有返回值的方法
Method m3 = clazz.getMethod("getSchool");//这是获取方法名为getSchool并且没有参数的方法
String school =(String)m3.invoke(obj);//调用有返回值,但是没有参数的方法
System.out.println(school);
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
打印结果:
二、反射机制调用指定属性
1.在反射机制中,可以直接通过Filed类操作类中的属性,通过Field类提供的set()和get()方法就可以完成设置和取得属性内容的操作。
2.public Field getField(String name) 返回此Class对象表示的类或接口的指定public的Field。
3.public Field getDeclaredField(String name)返回此Class对象表示的类或接口的指定的Field。
4.在Field中:
①public Object get(Object obj)取得指定对象obj上此Field的属性内容
②public void set(Object obj.Object value)设置指定对象obj上此Field的属性内容
注:在类中属性都设置为private的前提下,在使用set()和get()方法时,首先要使用Field类中的setAcessible(true)方法将需要操作的属性设置为可以被外部访问。
③public void setAccessible(true)访问私有属性时,让这个属性可见。
packageday19;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;public classTest1 {public static voidmain(String[] args){try{
Class clazz= Class.forName("day19.Student");//反射创建一个对象
Constructor con =clazz.getConstructor();
Student stu=(Student)con.newInstance();
Field f= clazz.getField("school");//获取名称为school的属性
f.set(stu,"第三中学");//对stu对象的school属性设置值“第三中学”
String school = (String)f.get(stu);//获取stu对象的school属性的值
System.out.println(school);//如果是私有属性
Field f1 = clazz.getDeclaredField("privateField");
f1.setAccessible(true);//解除私有的封装下面就可以强制调用这个属性
f1.set(stu,"测试私有属性");
System.out.println(f1.get(stu));
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
打印结果: