以编程方式选择从哪个包中获取课程

时间:2015-09-13 22:32:32

标签: java package

如果我有两个具有相同C类的Px和Py包,有没有办法以编程方式选择是否要从Px或Py中取C? Px和Py(或更多包)名称也未提前知道。

我有很多代码,我使用C,但我想从我可以互换的地方使用包。

有没有一种干净的方法来实现这个目标?

2 个答案:

答案 0 :(得分:2)

可以使用反射来完成。 使用Class<?> c = Class.forName("somepackage.SomeClass");获取类,然后您可以选择所需的构造函数并调用它:

Constructor<?> ctor = c.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });

答案 1 :(得分:2)

两个不同包中的一个类C完全不同,所以你不能用一个替换另一个,除非你:

  1. 使用由类C的所有版本实现的接口。 (推荐)
  2. 使用反射访问班级C(不推荐)
  3. 使用接口,类甚至不必具有相同的名称。

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