Search code examples
javagenericscastingclassloader

Cast a class that is dynamically obtained


I am trying to cast a class that I dynamically obtain that has implemented an interface. I have tried the following below but it doesn't seem to work. How I achieve this.

public InterfaceX test(){

 InterfaceX x = null;
 Class<?> classX = Class.forName("com.TestClassX");
 x = (InterfaceX) classX;
 return  x;

}

EDIT: I dont want to create an instance, since I am just looking to simply call a static method defined by the interface.


Solution

  • If x is a Class object, you cannot do x.staticMethod(). However, this is possible using reflection.

    public interface Interface {
        static void method() {
            System.out.println("Hello, World!");
        }
    }
    

    Then, in the main class you can do this.

    import java.lang.reflect.*;
    
    public class Main  {
    
        public static void invokeMethod(String className)  {
            try {
                Class<?> clazz = Class.forName(className);
                Method method = clazz.getDeclaredMethod("method");
                method.invoke(null);   // null is used for static methods. For instance methods, pass the instance.
            } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            invokeMethod("Interface");
        }
    }
    

    This works, but you should generally try to avoid using reflection (anything in java.lang.reflect). Most of the time there is a better solution to the problem you are trying to solve.