<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. java語言

    Java面試題如何通過反射獲取和設置對象私有字段的值

    時間:2025-04-08 20:46:43 java語言 我要投稿
    • 相關推薦

    Java面試題如何通過反射獲取和設置對象私有字段的值

      引導語:private關鍵字定義的都是私有字段,以下是百分網小編分享給大家的Java面試題如何通過反射獲取和設置對象私有字段的值?歡迎閱讀學習!

    Java面試題如何通過反射獲取和設置對象私有字段的值

      如何通過反射獲取和設置對象私有字段的值?

      答:可以通過類對象的getDeclaredField()方法字段(Field)對象,然后再通過字段對象的setAccessible(true)將其設置為可以訪問,接下來就可以通過get/set方法來獲取/設置字段的值了。下面的代碼實現了一個反射的工具類,其中的兩個靜態方法分別用于獲取和設置私有字段的值,字段可以是基本類型也可以是對象類型且支持多級對象操作,例如ReflectionUtil.get(dog, “owner.car.engine.id”);可以獲得dog對象的主人的汽車的引擎的ID號。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    import java.util.ArrayList;
    import java.util.List;
     
    /**
     * 反射工具類
     * @author 駱昊
     *
     */
    public class ReflectionUtil {
     
        private ReflectionUtil() {
            throw new AssertionError();
        }
     
        /**
         * 通過反射取對象指定字段(屬性)的值
         * @param target 目標對象
         * @param fieldName 字段的名字
         * @throws 如果取不到對象指定字段的值則拋出異常
         * @return 字段的值
         */
        public static Object getValue(Object target, String fieldName) {
            Class<?> clazz = target.getClass();
            String[] fs = fieldName.split("\\.");
     
            try {
                for(int i = 0; i < fs.length - 1; i++) {
                    Field f = clazz.getDeclaredField(fs[i]);
                    f.setAccessible(true);
                    target = f.get(target);
                    clazz = target.getClass();
                }
     
                Field f = clazz.getDeclaredField(fs[fs.length - 1]);
                f.setAccessible(true);
                return f.get(target);
            }
            catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
     
        /**
         * 通過反射給對象的指定字段賦值
         * @param target 目標對象
         * @param fieldName 字段的名稱
         * @param value 值
         */
        public static void setValue(Object target, String fieldName, Object value) {
            Class<?> clazz = target.getClass();
            String[] fs = fieldName.split("\\.");
            try {
                for(int i = 0; i < fs.length - 1; i++) {
                    Field f = clazz.getDeclaredField(fs[i]);
                    f.setAccessible(true);
                    Object val = f.get(target);
                    if(val == null) {
                        Constructor<?> c = f.getType().getDeclaredConstructor();
                        c.setAccessible(true);
                        val = c.newInstance();
                        f.set(target, val);
                    }
                    target = val;
                    clazz = target.getClass();
                }
     
                Field f = clazz.getDeclaredField(fs[fs.length - 1]);
                f.setAccessible(true);
                f.set(target, value);
            }
            catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
     
    }

    【Java面試題如何通過反射獲取和設置對象私有字段的值】相關文章:

    java獲取Class對象的方法08-12

    PHP如何設置和取得Cookie值08-07

    Java如何面向對象08-15

    JAVA如何獲取HTTP請求頭10-22

    Java對象和類08-27

    java中什么是字段07-23

    如何檢測和設置路由器MTU值10-24

    如何設置java的運行環境10-15

    如何理解Java面向對象07-06

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人