四.反射动态方法调用
讲完反射的构造方法实例化,下面是反射动态方法调用
1.反射调用无参动态方法
1.先获取到方法对象
2.调用getMethod,第一个参数为方法名,第二个:调用这个方法要传的参数类型
因为我们是无参动态方法,所以不需要传参数类型
3.调用invoke(obj, args);方法
obj:类实例 args:参数值
因为没有参数,所以不需要传参数值
package com.YU; import java.lang.reflect.Method; /** * 反射动态方法调用 * @author 21879 * */ public class Demo3 { public static void main(String[] args) throws Exception { Class c = Student.class; Student stu = (Student) c.newInstance(); /** * 反射调用无参方法 * 1.先获取到方法对象 * 2.调用getMethod,第一个参数为方法名,第二个:调用这个方法要传的参数类型 */ Method m1 = c.getMethod("hello"); //obj:类实例 Object invoke = m1.invoke(stu); System.out.println(invoke); } }
运行结果:
加载进jvm中!
调用无参构造方法创建了一个学生对象
你好!我是null
null
这里因为没有传参数,所以是null
2.反射调用有参方法
Class c = Student.class; Student stu = (Student) c.newInstance(); /** * 反射调用有参方法 */ Method m2 = c.getMethod("hello", String.class); Object invoke2 = m2.invoke(stu, "大傻子"); System.out.println(invoke2);
运行结果:
大傻子你好!我是null
null
这里传的参数是前面的name值并没有后面的sname所以后面的值为null
3.反射调用有参私有的动态方法
Class c = Student.class; Student stu = (Student) c.newInstance(); /** * 反射调用有参私有的动态方法 */ Method m3 = c.getDeclaredMethod("add", Integer.class,Integer.class); m3.setAccessible(true); Object invoke3 = m3.invoke(stu, 1,3); System.out.println(invoke3);
运行结果:3
这里需要注意的是:像之前调用私有的构造方法一样,只要调用私有方法时就需要通过setAcessible打开私有方法
五.反射读写属性
1.通过反射获取对象中的所有属性
package com.YU; import java.lang.reflect.Field; /** * 反射读写属性 * * @author 21879 * */ public class Demo4 { public static void main(String[] args) throws Exception { Class c1 = Student.class; //实例化一个对象 Student stu = new Student("s001","YU"); stu.age = 18; //获取到stu的sid和sname值-->获取到对象中的所有属性值 Field[] filed = c1.getDeclaredFields(); for (Field f : filed) { f.setAccessible(true); System.out.println(f.getName()+":"+f.get(stu)); } } }
运行结果:
sid:s001 sname:YU age:18
2.通过反射修改对象属性值
package com.YU; import java.lang.reflect.Field; /** * 反射读写属性 * * @author 21879 * */ public class Demo4 { public static void main(String[] args) throws Exception { Class c1 = Student.class; //实例化一个对象 Student stu = new Student("s001","YU"); stu.age = 18; //获取到stu的sid和sname值-->获取到对象中的所有属性值 Field snamefield = c1.getDeclaredField("sname"); snamefield.setAccessible(true); snamefield.set(stu, "Chat"); Field[] filed = c1.getDeclaredFields(); for (Field f : filed) { f.setAccessible(true); System.out.println(f.getName()+":"+f.get(stu)); } } }
运行结果:
sid:s001 sname:Chat age:18
很明显,我们的sname值发生了更改