2013-02-18 43 views
2

我有一個作爲偵聽器的私有抽象類。我可以訪問它只反映。我如何實現這個類?如何通過反射來實現抽象類

public class A { 

    private abstract class OnWorkListener { 
     public abstract void onWork(int param); 
    } 

    private OnWorkListener mListener; 

    public A(OnWorkListener listener) { 
     mListener = listener; 
    } 

    public void work() { 
     // some working 
     if(mListener != null) { 
      mListener.onWork(0); 
     } 
    } 
} 



public class B { 

    private static final String TAG = B.class.getSimpleName(); 

    public B() { 
       //How to overwrite it? 
     WorkListener listener = new WorkListener() { 
      public void onWork(int what) { 
       Log.d(TAG, "onWork "+what); 
      } 
     }; 
     A a = new A(listener); 
     a.work(); 
    } 
} 

問題是我無法創建抽象類的實例。我需要先實現它。但我找不到答案。

+0

你在做什麼對我來說似乎很好。有什麼問題? – 2013-02-18 15:12:07

+0

您將無法在A類以外的任何地方實現'OnWorkListener',因爲它是私人的。 – 2013-02-18 15:15:13

+1

如果你把它作爲一個接口,你可以使用'Proxy'。但是,我通常建議不要使用反射。 (或者'int's表示不是數字的東西。) – 2013-02-18 15:15:31

回答

4

有沒有辦法實現類或接口與反思 - 在一定意義上,反思是「只讀」,讓你檢查和處理什麼是已經存在。

你需要發出的Java代碼,以建立在運行時實現。有幾種可用的選項 - 檢查出this answer的一些非常好的參考。

0

實際上有兩個錯誤的一個: - A.WorkListener不是的B可見的(因爲它是私有的) - A.WorkListener需要的「類實例」(因爲它不是靜態的)

由於A的構造函數是公共的,因此將WorkListener聲明爲公共也是有意義的。 (但是包的可見性也可以工作,只要A和B在同一個包中)。

公共類A {

public abstract class WorkListener { 
     public abstract void onWork(int param); 
    } 
... 
} 
+0

上覆蓋方法'WorkListener'類不適合我。它只是例子 – melnik 2013-02-18 15:33:01

+0

所以你不能控制A的源代碼? – Javier 2013-02-18 15:38:35

0

您試圖在B類實行私人類位於B級A級。中不容看到任何類,it's喜歡嘗試訪問來自課堂外的私人屬性。

如果你的問題反駁實現,爲什麼B不能看到它,只是重構類A,並做「移動到外層」,這意味着讓你的私人類像A或B一樣。另一種選擇是公開。