2013-02-18 311 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一样。另一种选择是公开。