2013-02-18 4 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

То, что вы делаете, кажется мне прекрасным. В чем проблема? –

+0

Вы не сможете реализовать 'OnWorkListener' из любого места вне класса A, поскольку он является приватным. –

+1

Если вы создали интерфейс, вы можете использовать 'Proxy'. Тем не менее, я вообще предлагаю не использовать рефлексию вообще. (Или 'int' для вещей, которые ясны, а не числа.) –

ответ

4

Невозможно реализовать классы или интерфейсы с отражением - в определенном смысле отражение является «только для чтения», позволяя вам исследовать и управлять тем, что уже существует.

Вам нужно испустить код Java, чтобы построить реализацию во время выполнения. Для этого есть несколько вариантов: посмотрите this answer на некоторые очень полезные ссылки.

0

Есть на самом деле две ошибки в одном: - A.WorkListener не видно из B (потому что это частная) - A.WorkListener нужен «заключающий экземпляр» А (потому что она не статична)

Поскольку конструктор A является общедоступным, имеет смысл объявить WorkListener публичным. (но видимость пакета тоже будет работать, при условии, что A и B находятся в одном пакете).

общественного класс А {

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

Класс 'WorkListener' для меня не является видимым. Это просто пример – melnik

+0

Итак, у вас нет контроля над исходным кодом A? – Javier

0

Вы пытаетесь реализовать в классе Б а частного класс расположен в пределах класса A. Класс B не может видеть, что класс вообще, как подмигнул пытаюсь получить доступ частный атрибут вне класса.

Если ваш вопрос относится к реализации, и почему B не может его увидеть, просто отредактируйте класс A и сделайте «Переместить внутренний на внешний уровень», что означает сделать ваш частный класс классом точно так же, как A или B. Другой вариант - сделать его общедоступным.

Смежные вопросы