2011-11-24 6 views
5

주어진 클래스 인스턴스에 대해 메소드를 반사적으로 대체 할 수 있습니까?클래스의 인스턴스에 대한 메서드를 재정의 하시겠습니까?

전제 조건 : 게임에 무시할 수있는 방법 act()이 있습니다.

public class Foo { 

    public Method[] getMethods() { 
    Class s = Game.class; 
    return s.getMethods(); 
    } 

    public void override() 
    { 
    Method[] arr = getMethods() 
    for (int i = 0; i<arr.length; i++) 
    { 
     if (arr[i].toGenericString().contains("act()") 
     { 
     // code to override method (it can just disable to method for all i care) 
     } 
    } 
    }     
} 
+1

실제로 이런 종류의 흑 마법이 필요하지 않으면 바이트 코드 엔지니어링 및 프록시를 사용하여 구성 및 위임을 사용할 수 있습니다. –

+2

로컬 익명 내부 클래스 메서드를 사용하는 것으로 충분하지 않은 이유는 무엇입니까? 실제 클래스의 서브 클래 싱. – zeller

+0

주어진 인스턴스에서 서브 클래스를 동적으로 생성하고, 해당 클래스의 act 메소드를 재정의하고, 이전 인스턴스를 삭제하는 것이 더 쉬울까요? –

답변

7

는 게임 인터페이스 또는 당신이 그것에 대해 Proxy을 사용할 수 있습니다 act() 방법에 인터페이스를 구현합니다. 인터페이스가 작 으면 가장 우아한 방법은 Decorator design pattern을 사용하여 구현하는 클래스를 만드는 것입니다.

+2

+1 데코레이터 제안. 여기서 반사 될 필요가 없습니다. – artbristol

+2

게임은 클래스입니다 –

+0

코드 예? –

1

순수 Java를 사용하여 클래스의 메소드를 동적으로 대체 할 수 없습니다. The third-party library cglib은 동적 하위 클래스를 만들 수 있습니다. 그걸 확인하고 싶을 수도 있습니다.

인터페이스에 대해 코드를 작성할 수 있다면 Java dynamic proxy을 사용하여 아래 예와 같이 동작을 재정의하는 프록시 개체를 만들 수 있습니다. Game이 인터페이스 IGame을 구현한다고 가정합니다.

관련 문제