java反射——字段

       大家都知道反射技术在Java里面时非常重要的一个技术点,因为Java好多框架的编写都是基于反射的,别的不多说,spring框架里面的IOC就是基于反射实现。那么什么是反射呢?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。说白了,反射就是加载类,并且反射出类的各个组成部分的一种实现方式。

       Java是一种面向对象的语言,它使用一个类中的字段对数据进行分装,这样的话可以方便类的操作和描述,下面的例子将演示如何利用反射获取类的字段。

1.创建一个简单的Person类

package com.day09;

public class Person {
    public String name = "zhangsan";
    private int age = 23;
    public static String country = "China";

}

2.利用Junit来演示进行演示测试

package com.day09;

import java.lang.reflect.Field;

import org.junit.Test;

public class ReflectFieldDemo {

    /**
     * 反射类的字段 public String name = "zhangsan";
     * 
     * @throws Exception
     */
    @Test
    public void reflectPublicField() throws Exception {
        // 将person类加载到内存中
        Class<?> clazz = Class.forName("com.day09.Person");
        // 通过clazz创建一个对象
        Person p = (Person) clazz.newInstance();
        // 通过字段的名字获取对应的字段
        Field filed = clazz.getField("name");
        // 获取字段的类型
        Class type = filed.getType();
        System.out.println(type);
        // 传入一个对象,来获取该对象的值
        Object obj = filed.get(p);
        if (type.equals(String.class)) {
            String value = (String) obj;
            System.out.println(value);
        }
        // 赋值
        filed.set(p, "王五");
        System.out.println(p.name);

    }

    /**
     * 反射类的字段 private int age = 23;
     * 
     * @throws Exception
     */
    @Test
    public void reflectPrivateField() throws Exception {
        // 将person类加载到内存中
        Class<?> clazz = Class.forName("com.day09.Person");
        // 通过clazz创建一个对象
        Person p = (Person) clazz.newInstance();
        // 因为是私有字段,需要通过getDeclaredField该方法传入字段的名字获取对应的字段
        Field filed = clazz.getDeclaredField("age");
        // 释放权限,设为可见
        filed.setAccessible(true);
        // 获取字段的类型
        Class type = filed.getType();
        System.out.println(type);
        // 传入一个对象,来获取该对象的值
        Object obj = filed.get(p);
        if (type.equals(int.class)) {
            int value = (int) obj;
            System.out.println(value);
        }
    }

    /**
     * 反射类的字段 public static String country = "China";
     * 
     * @throws Exception
     */
    @Test
    public void reflectStaticField() throws Exception {
        // 将person类加载到内存中
        Class<?> clazz = Class.forName("com.day09.Person");
        // 通过字段的名字获取对应的字段
        Field filed = clazz.getField("country");
        // 获取字段的类型
        Class type = filed.getType();
        System.out.println(type);
        // 因为是静态的无需传入对象,来获取该类该对象的值
        Object obj = filed.get(null);
        if (type.equals(String.class)) {
            String value = (String) obj;
            System.out.println(value);
        }
    }
}

至此,我们已将常见的几种通过反射获得类中字段的方法演示完毕,有不足的地方,希望大家多多提意见!

原文地址:https://www.cnblogs.com/nanyangke-cjz/p/7106438.html