Is it possible to invoke nested method inside nested object from real object using reflection? Something like this
JavaScript
x
val fieldDefinition = chatClient.javaClass.getDeclaredField("class1")
.type.getDeclaredField("class2").type.getDeclaredField("class3")
Real object i have is chatClient and i want to invoke method of class3, which i cannot obtain directly but via class1 path.
Advertisement
Answer
You can have a logic of fetching nested fields in a function inside a for
loop , so that you can avoid code duplication.
Whole code example in java:
JavaScript
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);
}
}
Here fieldPath
in getFieldValue
means path of the nested field object.