• 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);
            }
        }
    }

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

  • 相关阅读:
    “混乱有序”一首关于概率论的诗
    关于“混乱有序”理论的讨论 2020-09-20
    关于“混乱有序”理论的讨论 2020-08-30
    【Java】(有步骤!)模逆、模幂、十进制转十六进制、十六进制转十进制、xTime算法、LFSR画状态图、椭圆曲线加法、椭圆曲线乘法、获得椭圆曲线上的点
    算法导论第一课
    经典力学:第一课
    计算机科学及编程导论:第一课
    微积分重点:第十六至十八课
    微积分重点:第十四,十五课
    微积分重点:第十课至十三课
  • 原文地址:https://www.cnblogs.com/nanyangke-cjz/p/7106438.html
Copyright © 2020-2023  润新知