zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }

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

  • 相关阅读:
    js 动态 activex 组件
    nodejs 任务调度使用
    javascript 停止事件冒泡以及阻止默认事件冒泡
    使用SQL字符串反转函数REVERSE巧妙实现lastindexof功能
    morris.js 简单学习
    weblogic启动受管服务器报错Authentication for user weblogic denied (weblogic 11g 域账号密码不生效的解决方法)
    正向代理与反向代理【总结】
    不休息的工作都是浪费时间
    Oracle实例名,服务名等概念区别与联系
    Tomcat启动找不到JRE_HOME的解决方法
  • 原文地址:https://www.cnblogs.com/nanyangke-cjz/p/7106438.html
Copyright © 2011-2022 走看看