Java中反射学习系列教程四-常用API方法(三)
                
                    
                        - 作者:
                                凯哥Java(公众号:凯哥Java)
                        
- 
                                    反射
                            
- 时间:2019-06-26 21:19
- 8031人已阅读
 
                
                
                
                
                简介
                        本文是《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对象进行操作。