实现:
package com.ljy;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
*
* @ClassName: MethodFieldTest
* @Description: 采用反射技术创建对象后对目标类的成员变量和成员方法进行访问
* @author ljy
* @date 2019年9月12日 下午2:51:52
*
*/
public class MethodFieldTest {
public static void main(String[] args) {
try {
// 获取Class对象
Class clazz = Class.forName("com.ljy.Teacher");
// 动态创建Teacher对象
Object obj = clazz.newInstance();
/**
* 采用反射技术创建对象后对目标类的成员变量进行访问
*/
// 调用getDeclaredField()方法取得name的属性对应的Field对象
Field field = clazz.getDeclaredField("name");
// 取消属性的访问控制权限,即使private属性也可以进行访问
field.setAccessible(true);
// 调用get()方法取得对应的属性值 , field.get(obj)相当于obj.getName()
System.out.println("初始值:name="+field.get(obj));
// 调用set()方法给对应属性赋值
field.set(obj, "团团");
// 调用get()方法取得对应的属性修改后的值
System.out.println("赋值后:name="+field.get(obj));
/**
* 采用反射技术创建对象后对目标类的成员方法进行访问
*/
// 调用getDeclaredMethod方法取得Teacher类中setSex()方法对应的Method对象
Method method = clazz.getDeclaredMethod("setSex", new Class[]{String.class});
// 调用invoke()方法调用method对象代表的方法
Object result = method.invoke(obj, new Object[]{"男"});
// 取得sex的属性对应的Field对象
field = clazz.getDeclaredField("sex");
// 取消属性的访问控制权限,即使private属性也可以进行访问 (每次重新给field赋值后都要重新给权限)
field.setAccessible(true);
// 调用get()方法取得对应的属性修改后的值
System.out.println("sex="+field.get(obj));
} catch (Exception e) {
e.printStackTrace();
}
}
}
Teacher类(目标类):
package com.ljy;
public class Teacher {
private Integer id;
private String name;
private String sex;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Teacher(Integer id, String name, String sex) {
super();
this.id = id;
this.name = name;
this.sex = sex;
}
public Teacher(String name, String sex) {
super();
this.name = name;
this.sex = sex;
}
public Teacher() {
}
@Override
public String toString() {
return "Teacher [id=" + id + ", name=" + name + ", sex=" + sex + "]";
}
}