Michael Hozza
Michael Hozza

Reputation: 67

Java chained reflection

I have this chained method call

Integer.parseInt(A.get().getC().getD().toString());

I need to make this with reflection. I know that I can use Class.forName(String class) and then invoke methods, but how do I save method results so I can call that chain.

Classes:

public class A
{
       public static B get() { return new B(); }
}

public class B
{
     public C getC() { return new C();}
}

public class C
{
      public C getD() { return new D();}
}

Upvotes: 2

Views: 250

Answers (1)

Akif Hadziabdic
Akif Hadziabdic

Reputation: 2890

Suppose we have this classes:

public class A {
   public B getB() { return new B(); }
   public static B getBStatic() { return new B(); }
}
public class B { public C getC() { return new C();}}
public class C { public String getD() { return "done"}}

Example 1:

public static void main(String[] args) throws Exception {
    Class<A> clazz = A.class;
    Constructor<A> constructor = clazz.getConstructor();
    A instance = constructor.newInstance();

    Method getMethod = clazz.getDeclaredMethod("getB");
    Object b = getMethod.invoke(instance);

    Method getCMethod = b.getClass().getDeclaredMethod("getC");
    Object c = getCMethod.invoke(b);

    Method getDMethod = c.getClass().getDeclaredMethod("getD");
    String d = (String) getDMethod.invoke(c);
    System.out.println(d); // done
}

Example 2:

public static void main(String[] args) throws Exception {
    reflection(new A(), "getB", "getC", "getD"); // invoke non static methods
    reflection(new A(), "getBStatic", "getC", "getD"); // invoke static and nonstatic methods
    reflection(A.getBStatic(), "getC", "getD"); // provide object from static method 
    reflection(invokeStaticMethod(A.class, "getBStatic"), "getC", "getD"); // invoke static method without instance
}

public static Object invokeStaticMethod(Class<?> clazz, String methodName) throws Exception {
    return clazz.getMethod(methodName).invoke(clazz);
}

public static void reflection(Object instance, String... methods) throws Exception {
    Object item = instance;
    for (String methodName : methods) {
        item = item.getClass().getDeclaredMethod(methodName).invoke(item);
    }
    System.out.println(item); // done
}

Upvotes: 2

Related Questions