classObj.getField 方法
classObj.getField() 获得指定的public 修饰的成员变量 Field 对象。
我们定义了一个员工类 Employee。我特意设置了部门 dname 为public。
public class Employee {
private int empno;
private String empname;
public String dname;
static {
System.out.println("类已被加载到JVM");
}
public Employee(int empno, String empname,String dname ) {
this.empno = empno;
this.empname = empname;
this.dname=dname;
System.out.println("带参构造方法被执行");
}
@Override
public String toString() {
return "Employee{" +
"empno=" + empno +
", empname='" + empname + '\'' +
", dname='" + dname + '\'' +
'}';
}
}
我们依然通过反射机制来创建对象。而且进一步,通过反射机制来获取对象的public成员变量。
public class FieldDemo {
public static void main(String[] args) {
try {
//将 指定 类加载到 JVM, 并返回Class 对象
Class empClass = Class.forName("indi.chester.fileddemo.Employee");
// 通过 Class 对象.getConstructor() 获得 Constructor 对象
Constructor empConstructor= empClass.getConstructor(new Class[]{int.class, String.class,String.class});
//通过Constructor对象.newInstance() 调行代参构造函数
Employee emp1=(Employee) empConstructor.newInstance( new Object[] {20200189,"Tom","sales"});
// Class对象.getField 获取公有的成员变量对应的 Field对象
Field dnameField = empClass.getField("dname");
//field 对象.get(obj) 获得指定对象的 成员变量
String empDname = (String) dnameField.get(emp1);
System.out.println("Tom 部门为: "+ empDname);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
和上一章节相比,这一段代码主要有两行不同。
Field dnameField = empClass.getField("dname");
empClass.getField()传入想要访问的变量名,返回这个变量的Field 对象。
随后通过 dnameField.get() 方法传入具体的对象,来访问这个对象的成员变量。dnameField.get() 方法返回的是一个 Object 类型,需要进行强制类型转换。
String empDname = (String) dnameField.get(emp1);
最后运行程序, 输出结果:
类已被加载到JVM
带参构造方法被执行
Tom 部门为: sales
Last updated
Was this helpful?