interface Bank {
    void connect();
}

class SBI implements Bank {
    static{
        System.out.println("Hello from SBI static");
    }
    public void connect() {
        System.out.println("Connected to SBI");
    }
}

class LooseCouplingTest {
    public static void main(String... args)throws Exception {
        String className = args[0];
        Class.forName(className);
    }
}

上面代码的输出似乎是Hello from SBI static
我应该在代码中添加什么,然后在also中添加Y来打印语句Connected to SBI
详细的解释是非常感谢

P.S.菜鸟在这里

最佳答案

您必须创建该对象的新实例(使用Class#newInstance()),将其强制转换为所需的类型(在您的方案中SBI),然后对其进行调用。

工作代码:

public class LooseCouplingTest {
    public static void main(String... args)throws Exception {
        String className = args[0];
        Class<?> clazz = Class.forName(className);
        Object obj = clazz.newInstance();
        SBI mySBI = (SBI) obj;
        mySBI.connect();
    }
}

说明:
  • Class.forName("pkg.SBI")获取pkg.SBI对象中clazz类的引用。
  • 由于clazz拥有对SBI的引用,因此调用clazz.newInstance();与调用new SBI();相同。
  • 调用clazz.newInstance();之后,变量obj将接收一个SBI实例。
  • 当您要调用SBI方法且obj的类型为Object(即newInstance()方法的返回类型)时,您必须将其转换为SBI,然后才调用connect()

  • 使用Java的Reflection API:

    如果您想走得更远甚至不进行强制转换(这种方式LooseCouplingTest永远不需要导入SBI),则可以使用 Java's Reflection API 来调用connect()方法。

    这是它的工作代码:
    public class LooseCouplingTest {
        public static void main(String... args) throws Exception {
            String className = args[0];
            Class<?> clazz = Class.forName(className);
            Object obj = clazz.newInstance();
            java.lang.reflect.Method connect = clazz.getMethod("connect");
            connect.invoke(obj);
        }
    }
    

    关于java - 与Class.forName()的松耦合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15996229/

    10-10 12:49