如果我有两个具有相同C类的Px和Py包,有没有办法以编程方式选择是否要从Px或Py中取C? Px和Py(或更多包)名称也未提前知道。
我有很多代码,我使用C,但我想从我可以互换的地方使用包。
有没有一种干净的方法来实现这个目标?
答案 0 :(得分:2)
可以使用反射来完成。
使用Class<?> c = Class.forName("somepackage.SomeClass");
获取类,然后您可以选择所需的构造函数并调用它:
Constructor<?> ctor = c.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });
答案 1 :(得分:2)
两个不同包中的一个类C
完全不同,所以你不能用一个替换另一个,除非你:
C
的所有版本实现的接口。 (推荐) C
。 (不推荐) 使用接口,类甚至不必具有相同的名称。
COM /示例/ P / MyInterface.java
package com.example.p;
public interface MyInterface {
public void doSomething();
}
COM /示例/ PX / C.java
package com.example.px;
import com.example.p.MyInterface;
public class C implements MyInterface {
@Override
public void doSomething() {
// do something px related
}
}
COM /示例/吡啶/ C.java
package com.example.py;
import com.example.p.MyInterface;
public class C implements MyInterface {
@Override
public void doSomething() {
// do something py related
}
}
COM /示例/吡啶/ MyOtherC.java
package com.example.py;
import com.example.p.MyInterface;
public class MyOtherC implements MyInterface {
@Override
public void doSomething() {
// do something else py related
}
}
现在,您可以按类名MyInterface
获取接口String
的实现:
String className = "com.example.py.MyOtherC";
MyInterface myInterface = (MyInterface)Class.forName(className).newInstance();
myInterface.doSomething();