Java中反射学习系列教程四-常用API方法(三)
- 作者:
凯哥Java(公众号:凯哥Java)
-
反射
- 时间:2019-06-26 21:19
- 7698人已阅读
简介
本文是《Java中反射学习系列教程》中的第五篇文章,如果想系统的学习反射技术,建议跟着本教程从第一篇文章开始。本文我们接着之前的讲解。本文主要内容1:通过反射调用方法2:反射操作类的属性4.2.8 方法调用如果想要调用反射出来对象的方法,就要看method对象的方法。我们查看method对象API中可以看到:有个invoke方法参数说明:方法调用步骤:1:获取到class对象2:获取对象
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
微信号 kaigejava2022
本文是《Java中反射学习系列教程》中的第五篇文章,如果想系统的学习反射技术,建议跟着本教程从第一篇文章开始。本文我们接着之前的讲解。
本文主要内容
1:通过反射调用方法
2:反射操作类的属性

4.2.8 方法调用
如果想要调用反射出来对象的方法,就要看method对象的方法。我们查看method对象API中可以看到:有个invoke方法

参数说明:

方法调用步骤:
1:获取到class对象
2:获取对象实例
3:获取对象方法
4:方法调用invoke方法
Demo实例代码:
/** * 方法调用 */ @Test public void invokeMethodTest()throws Exception{ //1:获取到class对象 Class clazz1 = Class.forName("com.kaigejava.domain.Student"); //2:获取对象实例 Constructor<?> constructor = clazz1.getConstructor(); Student student = (Student)constructor.newInstance(); Class [] methodParamArgs = new Class[]{String.class}; //3:获取对象方法 获取到setSchoolName方法 Method setSchoolNameMethod = clazz1.getMethod("setSchoolName",methodParamArgs); //4:方法调用invoke方法 set方法调用 setSchoolName方法 setSchoolNameMethod.invoke(student,new Object[]{"北京大学附属中学"}); log.info("获取学校名称为:{}",student.getSchoolName()); //get方法调用 Method getSchooleNAMEmETHOD = clazz1.getMethod("getSchoolName"); Student getStudent = (Student)constructor.newInstance(); getStudent.setSchoolName("清华大学附属中学"); log.info("通过调用getSchooleName方法获取到的数据为:{}",getSchooleNAMEmETHOD.invoke(getStudent));
}
|

运行结果:

4.2.9 操作类的属性
操作类的属性步骤:
1:获取class对象
2:通过class对象获取到实例对象
3:通过实例对象获获取到需要操作的属性
4:设置属性是否可以操作private属性。Field.setAccessible()
值有:true:可以操作私有属性;false:不可以操作私有属性
4:可以通过属性的set(Object obj,Object value)方法给属性重新赋值
5:可以通过属性的get(Object)方法获取到属性值

Demo示例代码:
/** * 操作类的属性 */ @Test public void fieldTest()throws Exception{ //1:获取到class对象 Class clazz1 = Class.forName("com.kaigejava.domain.Student"); //2:通过class对象获取到对象实例 Student student =(Student) clazz1.newInstance(); //3:通过对象实例获取到需要操作的属性名称 Field field = clazz1.getField("realName"); //4:设置是否可以操作private属性。true:运行操作;false:不允许操作。 field.setAccessible(true); //5:调用field.set(Object obj,Object value)方法给对象的属性设置新值 field.set(student,"凯哥Java"); //6:调用field.get(Object obj)方法,得到对象属性的值 String getRelName = (String )field.get(student); log.info("通过反射设置public属性后,得到属性值为:{}",getRelName); //获取私有属性 并设置值 Field schoolNameField = clazz1.getDeclaredField("schoolName"); //此次如果设置了false。会出现如下错误: //java.lang.IllegalAccessException: Class com.kaigejava.ReflectDemoTest can not access a member of class com.kaigejava.domain.Student with modifiers "private" schoolNameField.setAccessible(true); schoolNameField.set(student,"清华大学附属中学"); String getSchoolName = (String)schoolNameField.get(student); log.info("反射获取到private属性 schoolName的值为:{}",getSchoolName);
}
|

运行结果:

在操作private属性的时候,如果设置accessible的值为false会怎样呢?
can not access a member of with modifiers "private"
如下图:

说明:
当属性是public的时候,accessible的值为true或false都可以
当属性是private的时候,accessible为true可以操作。为false的时候一异常
下节预告:
在下一章节中,我们将通过模拟基于xml配置的spring初始化bean并得到bean对象进行操作。