Java中反射学习系列教程四-常用API方法(三)
凯哥java 凯哥java
本文是《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);
}