Java 与Class.forName()的松耦合

Java 与Class.forName()的松耦合,java,reflection,loose-coupling,Java,Reflection,Loose Coupling,上述代码的输出似乎是 来自SBI static的问候 我应该向我的代码和Y中添加什么,以打印语句 连接到SBI 请详细解释,不胜感激 p.S.Noob这里您必须创建对象的新实例(使用类#newInstance()),将其强制转换为您想要的类型(在您的场景中SBI),然后调用它 工作代码: interface Bank { void connect(); } class SBI implements Bank { static{ System.out.printl

上述代码的输出似乎是
来自SBI static的问候

我应该向我的代码和Y中添加什么,以
打印语句
连接到SBI

请详细解释,不胜感激


p.S.Noob这里

您必须创建对象的新实例(使用
类#newInstance()
),将其强制转换为您想要的类型(在您的场景中
SBI
),然后调用它

工作代码:

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);
    }
}
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()
加载该类。加载类的一部分是执行静态初始值设定项块。这就是为什么您会看到打印的“Hello from SBI static”(静态{…}
部分是静态初始值设定项块)

要显示“已连接到SBI”,必须创建该类的实例,并在其上调用
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);
    }
}

Class@abcdjunior谢谢你抽出时间。。你能一步一步地解释为什么我们要创建一个对象的新实例(使用Class#newInstance()),将它转换为我们想要的类型,然后调用它吗?@SnackySrikanth是:
Class.forName(“pkg.SBI”)
获取
clazz
对象中
pkg.SBI
类的引用。由于
clazz
持有对
SBI
的引用,因此调用
clazz.newInstance()
与调用相同:
newsbi()。调用
clazz.newInstance()后
,则变量
obj
将接收一个
SBI
实例。最后,当您要调用
SBI
方法时,
obj
的类型是
Object
(这是newInstance()方法的返回类型),您必须将其强制转换为
SBI
,然后才调用
connect()
。(我编辑了答案以包含此内容。请告诉我是否足够。)
Class<? extends Bank> bankClass = (Class<? extends Bank>)Class.forName(className);
Bank bank = bankClass.newInstance();
bank.connect();