переопределить метод для экземпляра класса? - PullRequest
5 голосов
/ 24 ноября 2011

Возможно ли рефлексивно переопределить метод для данного экземпляра класса?

Условие: в игре есть метод переопределения 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)
      }
    }  
  }                  
}

Ответы [ 2 ]

7 голосов
/ 24 ноября 2011

Если Game является интерфейсом или реализует интерфейс с методом act(), для этого можно использовать Proxy . Если интерфейс небольшой, вероятно, самый элегантный способ - создать класс, реализующий его, используя шаблон проектирования Decorator .

0 голосов
/ 24 ноября 2011

Невозможно динамически переопределить методы класса, используя чистый Java. Сторонняя библиотека cglib может создавать динамические подклассы.Вы можете проверить это.

Если вы можете кодировать интерфейс, то вы можете использовать динамический прокси Java для создания объекта прокси, который переопределяет поведение, как в примере ниже.Предположим, Game реализовывал интерфейс IGame.

class GameInvocationHandler implements InvocationHandler
{
    private Game game;
    public GameInvocationHandler(Game game)
    {
        this.game = game;
    }
    Object invoke(Object proxy, Method method, Object[] args)
    {
        if (method.toGenericString().contains("act()")
        {
            //do nothing;
            return null;
        }
        else
        {
            return method.invoke(game, args);
        }
    }
}

Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), IGame.class);
IGame f = (IGame) proxyClass.getConstructor(InvocationHandler.class).newInstance(new Object[] {  });
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...