我有一个接口(称其为Planet),其实现类受保护,并且我不能为此更改访问修饰符。但是,我需要在主类内部调用实现类的方法。例如,在实现类中,我具有:public void orbit() {distance++;}
我已经尝试过:private Planet planet = new PlanetImpl
,但是由于PlanetImpl类是受保护的并且位于不同的包中,因此找不到它,从而使该语句无效。我也尝试过将其留空,像这样
Planet planet; planet.orbit();
,但它引发NullPointerException。是否可以在不直接引用实现类的情况下调用方法?
答案 0 :(得分:1)
使用匿名内部类,我们可以做到。匿名类可以实现接口,我认为那时只有您有机会看到一个类在没有“ implements”关键字的情况下实现接口。
interface Planet {
public void orbit();
}
class PlanetMain {
private Planet p = new Planet () {
public void orbit() {
System.out.println("interface Planet class executed");
}
};
}
答案 1 :(得分:0)
在您的情况下,必须在某个地方创建该PlanetImpl
类的对象才能执行该方法。该接口仅具有该方法的定义,而没有实现。
答案 2 :(得分:0)
假定私有/受保护的impl类是内部类。要调用作为实例方法(非静态)的orbit()方法,您需要在外部类中创建一个公共的静态工厂方法,并使用此方法提供的实例来调用轨道。
基本代码示例
public class PlanetImplholder{
public static Planet getInstance(){
return new PlanetImpl();
}
private static class PlanetImpl implements Planet{
@Override
public void orbit() {
System.out.println("111");
}
}
}
从下面的任何地方调用该方法。
Planet planet = PlanetImplholder.getInstance();
planet.orbit();
答案 3 :(得分:0)
是否可以在不直接引用实现类的情况下调用方法?
否,这不可能。 sudo add-apt-repository ppa:serge-rider/dbeaver-ce
sudo apt-get update
sudo apt-get install dbeaver-ce
只是声明。要使用它,您必须使用Interface and implementation class
创建类或接口实例。但是您不能这样做,因为您想使用受保护的new
逻辑。
我认为您不想实现自己的类声明,然后创建并使用它的新实例。我认为,只有一种方法是使用反射。使用它,您可以创建受保护的类PlanetImpl
的实例,然后以常规方式使用它。
PlanetImpl
答案 4 :(得分:0)
我现在无法对其进行测试,但是您可以使用反射来访问对象的类属性。
Planet planetImpl = factory.getPlanet(); // getPlanet() returns PlanetImpl
Method orbit = planetImpl.getClass().getDeclaredMethod("orbit");
orbit.setAccessible(true);
orbit.invoke(planetImpl);
如果SecurityManager
阻止了对PlanetImpl的访问,则此方法可能无效。