Java学习day43-反射机制调用指定方法、指定属性
一、反射机制调用指定方法
通过反射,调用类中的方法,通过Method类完成。步骤:
1.通过Class类的getMethod(String name,Class...parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。
2.之后使用Object invoke(Object obj,Object[] args)进行调用,并向方法中传递要设置的obj对象的参数信息。
package day19; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test1 { public static void main(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)访问私有属性时,让这个属性可见。
package day19; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test1 { public static void main(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(); } } }
打印结果:


浙公网安备 33010602011771号