gpt4 book ai didi

java - 与 Class.forName() 松耦合

转载 作者:搜寻专家 更新时间:2023-10-31 20:03:50 25 4
gpt4 key购买 nike

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);
}
}

上面代码的输出看起来是
来自 SBI static 的问候

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

非常感谢详细的解释

附言菜鸟在这里

最佳答案

您必须创建对象的新实例(使用 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") 获取 clazz 对象中的 pkg.SBI 类的引用。
  • 由于 clazz 持有对 SBI 的引用,调用 clazz.newInstance(); 等同于调用:new SBI ();.
  • 在调用clazz.newInstance();之后,变量obj将接收到一个SBI实例。
  • 因为你想调用一个SBI方法并且obj的类型是Object(那是newInstance() 方法的返回类型),您必须将其转换为 SBI,然后才调用 connect()

使用 Java 的反射 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com