Java采用反射技术创建对象后对目标类的成员变量和成员方法进行访问
实现:
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 + "]"; } }