我有一个私有的抽象类作为监听器。我只能反映它访问它。我该如何实现该课程?
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 :(得分: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的类。另一种选择是将其公之于众。