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

问题是我无法创建抽象类的实例。我需要先实现它。但我找不到答案。

4

3 回答 3

4

没有办法用反射来实现类或接口——在某种意义上,反射是“只读的”,让你检查和操作已经存在的东西。

您需要发出 Java 代码才能在运行时构建实现。有几个选项可供选择 - 查看这个答案以获得一些非常好的参考资料。

于 2013-02-18T15:14:15.550 回答
0

实际上有两个错误: - A.WorkListener 在 B 中不可见(因为它是私有的) - A.WorkListener 需要 A 的“封闭实例”(因为它不是静态的)

由于 A 的构造函数是公共的,因此将 WorkListener 声明为公共也是有意义的。(但如果 A 和 B 在同一个包中,包可见性也可以工作)。

公共类 A {

    public abstract class WorkListener {
        public abstract void onWork(int param);
    }
...
}
于 2013-02-18T15:29:09.647 回答
0

您正在尝试在 B 类中实现位于 A 类中的私有类。B 类无论如何都看不到该类,这就像试图从类外部访问私有属性一样。

如果您的问题涉及实现以及为什么 B 看不到它,只需重构类 A 并执行“将内部级别移动到外部级别”,这意味着使您的私有类成为像 A 或 B 一样的类。另一种选择是将其公开。

于 2013-02-18T15:33:53.257 回答