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/