【问题标题】:How to implement abstract class via reflection如何通过反射实现抽象类
【发布时间】:2013-02-18 23:33:53
【问题描述】:

我有一个私有抽象类作为监听器。我只能通过反射访问它。如何实现该类?

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

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

【问题讨论】:

  • 你在做什么对我来说似乎很好。有什么问题?
  • 您将无法在 A 类之外的任何地方实现 OnWorkListener,因为它是私有的。
  • 如果你把它做成接口,你可以使用Proxy。但是,我通常建议根本不使用反射。 (或ints 用于明确而非数字的事情。)
  • 我可以通过反射获得类WorkListener,但不能通过newInstance()创建对象。我想覆盖 onWork 方法

标签: java reflection


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    公开课 A {

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

    【讨论】:

    • WorkListener 课程不适合我。它只是一个例子
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-07
      • 2021-10-19
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 2019-03-07
      相关资源
      最近更新 更多