# classObj.getField 方法

我们定义了一个员工类 Employee。我特意设置了部门 dname 为public。

```java
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成员变量。

```java
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();
        }

    }

}
```

和上一章节相比，这一段代码主要有两行不同。

```java
Field dnameField = empClass.getField("dname");
```

empClass.getField()传入想要访问的变量名，返回这个变量的Field 对象。

随后通过 dnameField.get() 方法传入具体的对象，来访问这个对象的成员变量。dnameField.get() 方法返回的是一个 Object 类型，需要进行强制类型转换。

```java
String empDname = (String) dnameField.get(emp1);
```

最后运行程序, 输出结果:

```markup
类已被加载到JVM
带参构造方法被执行
Tom 部门为: sales
```
