Java中反射学习系列教程四-常用API方法(三)

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

本文是《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对象进行操作。


Top Top