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

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

  • 相关阅读:
    [置顶] cocos2dx sqllite 增删查改等操作
    BZOJ 2933([Poi1999]地图-区间Dp)
    java使用batik转换svg文件
    算法小题目小结。。。
    [置顶] shell变量赋值-linux
    高级IO复用应用:聊天室程序
    NSUserDefaults的使用
    动态链接库与静态链接库的区别
    阐明iOS证书和provision文件
    Hyperic Agent 安装配置报
  • 原文地址:https://www.cnblogs.com/nanyangke-cjz/p/7106438.html
Copyright © 2020-2023  润新知