簡體   English   中英

沒有實現類的實例化接口

[英]Instantiate Interface without Implementation Class

我有一個接口(稱為 Planet),它的實現類是受保護的,我無法更改相同的訪問修飾符。 但是,我需要在主類中調用實現類的方法。 例如,在實現類中,我有: public void orbit() {distance++;} private Planet planet = new PlanetImpl public void orbit() {distance++;}我試過: private Planet planet = new PlanetImpl ,但是由於 PlanetImpl 類是受保護的並且在不同的包中,所以找不到它,使語句無效。 我也試過讓它為空,就像這個Planet planet; planet.orbit();一樣Planet planet; planet.orbit(); Planet planet; planet.orbit(); 但它拋出一個 NullPointerException。 是否可以在不直接引用實現類的情況下調用方法?

使用匿名內部類我們可以做到。 匿名類可以實現接口,我認為那時只有你才有機會看到一個類實現了一個沒有“implements”關鍵字的接口。

interface Planet  {
public void orbit();
}
class PlanetMain  {
private Planet p = new Planet () {
    public void orbit() {
        System.out.println("interface Planet class executed");
   }
 };
}

在您的情況下,您必須在某處創建該PlanetImpl類的對象來執行該方法。 接口只有該方法的定義,而不是實現。

假設私有/受保護的 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();

是否可以在不直接引用實現類的情況下調用方法?

不,這是不可能的 Interface and implementation class只是聲明。 要使用它,您必須使用new創建類或接口實例。 但是你不能這樣做,因為你想使用被保護的PlanetImpl邏輯。

我認為,您不想實現自己的類聲明,然后創建並使用它的新實例。 我認為,只有一種方法是使用反射。 使用它,您可以創建受保護類PlanetImpl的實例,然后以正常方式使用它。

Class<Planet> cls = (Class<Planet>)Class.forName("<full PlanetImpl class name, inclusing package>");
Constructor<Planet> constructor = cls.getDeclaredConstructor();
constructor.setAccessible(true);
Planet planet = constructor.newInstance();
planet.orbit();

我現在無法對其進行測試,但是您可以使用反射來訪問對象的類屬性。

Planet planetImpl = factory.getPlanet(); // getPlanet() returns PlanetImpl
Method orbit = planetImpl.getClass().getDeclaredMethod("orbit");
orbit.setAccessible(true);
orbit.invoke(planetImpl);

如果SecurityManager阻止訪問 PlanetImpl,這可能不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM