首页 > 解决方案 > 通过反射调用嵌套的 deepobject 方法

问题描述

是否可以使用反射从真实对象调用嵌套对象内的嵌套方法?像这样的东西

val fieldDefinition = chatClient.javaClass.getDeclaredField("class1")
  .type.getDeclaredField("class2").type.getDeclaredField("class3")

我拥有的真实对象是chatClient,我想调用class3的方法,我不能直接获得,而是通过class1路径。

标签: javakotlinreflection

解决方案


您可以在循环内的函数中获取嵌套字段的逻辑for,这样您就可以避免代码重复。

java中的整个代码示例:

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

class Class1 {
    Class2 class2 = new Class2();

}
class Class2 {
    Class3 class3 = new Class3();
}
class Class3 {
    Class4 class4 = new Class4();
}
class Class4 {

    public void display(){
        System.out.println("Hello World");
    }

}


public class Test {

    static Object getFieldValue(String fieldPath ,Object object) throws NoSuchFieldException, IllegalAccessException {
        String[] pathList = fieldPath.split("\\.");
        for(String path : pathList){
            Field field = object.getClass().getDeclaredField(path);
            field.setAccessible(true);
            object = field.get(object);
        }
        return object;
    }

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Class1 class1Object = new Class1();
        Object object = getFieldValue("class2.class3.class4", class1Object);

        Method method = object.getClass().getMethod("display");
        method.invoke(object);

    }
}

这里fieldPathgetFieldValue意思是嵌套字段对象的路径。


推荐阅读