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

클래스 A의 바깥 쪽에서는 'OnWorkListener'를 구현할 수 없습니다. –

+1

인터페이스로 만들었다면'Proxy'를 사용할 수 있습니다. 그러나, 나는 일반적으로 전혀 반사를 사용하지 않는 것이 좋습니다. (또는 'int'는 숫자가 아닌 것). –

답변

4

리플렉션을 사용하여 클래스 또는 인터페이스를 구현할 방법이 없습니다. 특정 의미에서 리플렉션은 "읽기 전용"이므로 이미 존재하는 것을 조사하고 조작 할 수 있습니다.

런타임시 구현을 빌드하려면 Java 코드를 방출해야합니다. 몇 가지 옵션을 사용할 수 있습니다 - 아주 좋은 참조를 위해 this answer을 확인하십시오.

0

하나 실제로 두 가지 오류가 있습니다 는 - (가 고정되지 않기 때문에) A.WorkListener이의 "둘러싸는 인스턴스를"필요

- A.WorkListener은 (비공개이기 때문에) 는 B에서 볼 수 없습니다

A의 생성자가 public이므로 WorkListener를 public으로 선언하는 것이 좋습니다. (A와 B가 동일한 패키지에있는 경우 패키지 가시성도 작동합니다).

공용 클래스 A는 {당신은 클래스 A. 클래스 B 내에 위치한 개인 클래스가 무엇이든지 그 클래스를 참조 할수 없어 클래스 B에서 구현하기 위해 노력하고있다

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

'WorkListener' 클래스가 저에게 적합하지 않습니다. 그냥 예제 – melnik

+0

그래서 A의 소스 코드를 제어 할 수 없습니까? – Javier

0

는 액세스하려고처럼 키우면 외부의 개인적인 속성.

당신의 질문이 구현을 되풀이하고 B가 그것을 볼 수없는 이유는 단지 리팩토링 클래스 A이고 "내부를 외부 레벨로 이동"합니다. 이는 개인 클래스를 A 또는 B와 같은 클래스로 만듭니다. 또 다른 옵션은 그것을 공개하는 것입니다.

관련 문제