如何通过反射实现抽象类

时间:2013-02-18 15:10:21

标签: java reflection

我有一个私有的抽象类作为监听器。我只能反映它访问它。我该如何实现该课程?

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

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

3 个答案:

答案 0 :(得分:4)

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

您需要发出Java代码才能在运行时构建实现。有几种选择 - 请查看this answer以获得一些非常好的参考资料。

答案 1 :(得分:0)

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

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

公共类A {

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

答案 2 :(得分:0)

您正尝试在B类中实现位于A类中的私有类.B类无法看到该类,就像尝试从类外部访问私有属性一样。

如果你的问题引用了实现以及为什么B看不到它,只需重构A类并执行“将内部移动到外层”,这意味着让你的私有类成为类似A或B的类。另一种选择是将其公之于众。