本示例使用Java反射机制分别设置当前类的private、public属性以及其父类的private属性来说明如何通过Java反射机制设置属性值。(注:设置继承的父类属性时,无法通过当前类的Class对象直接获取其属性字段,须通过其父类Class对象得到Field对象操作)
首先,建立父类User
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
建立子类Student继承User
public class Student extends User {
//学号
private String stuNo;
//专业
public String major;
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
}
新建测试类
public class Test {
public static void main(String[] args) throws Exception {
Object stu = new Student();
Class clazz = stu.getClass();
System.out.println("-------设置当前类stuNo(private)属性---------------");
System.out.println("Before stuNo:"+((Student)stu).getStuNo());
Field stuNo = clazz.getDeclaredField("stuNo");//通过反射获取stuNo字段
stuNo.setAccessible(true);//private属性必须设置
stuNo.set(stu,"13201233");
System.out.println("After stuNo:"+((Student)stu).getStuNo());
System.out.println("-------设置当前类major(public)属性---------------");
System.out.println("Before major:"+((Student)stu).getMajor());
Field major = clazz.getDeclaredField("major");//通过反射获取stuNo字段
major.set(stu,"软件工程");
System.out.println("After major:"+((Student)stu).getMajor());
System.out.println("-------设置继承的父类name属性------------");
System.out.println("Before name:"+((Student)stu).getName());
Field name = clazz.getSuperclass().getDeclaredField("name");//通过反射获取父类name字段
name.setAccessible(true);//private属性必须设置
name.set(stu,"Edward");
System.out.println("After name:"+((Student)stu).getName());
}
}
运行结果:
-------设置当前类stuNo(private)属性---------------
Before stuNo:null
After stuNo:13201233
-------设置当前类major(public)属性---------------
Before major:null
After major:软件工程
-------设置继承的父类name属性------------
Before name:null
After name:Edward
注意:设置private属性值时,必须设置setAccessible(true),否则会抛出如下异常:
Exception in thread "main" java.lang.IllegalAccessException: Class cn.ll.test.Test can not access a member of class cn.ll.test.Student with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
at java.lang.reflect.Field.set(Field.java:761)
at cn.ll.test.Test.main(Test.java:17)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)