Можно ли установить поведение по умолчанию для пользовательских (не нативных) методов / функций в Java? - PullRequest
1 голос
/ 11 мая 2010

Можно ли установить поведение по умолчанию для пользовательских (не нативных) методов / функций в Java?

Например, я хотел бы изменить стандартную «функцию», чтобы она вызывала System.out.println("message") при каждом вызове.

Итак, когда создается пользовательский метод / функция:

public String testMethod()
{
   //custom code
}

он должен выполнить только что добавленное поведение по умолчанию (в данном случае вывод системы) до запуска пользовательского кода.

Даже если это было бы плохим упражнением, возможно ли это? Может быть, расширяя класс функции или что-то?

Ответы [ 4 ]

3 голосов
/ 11 мая 2010

Одним из способов является использование Аспектно-ориентированного программирования (AOP) для Java: Aspect / J . Для того, что вы хотите, АОП позволит вам вводить код в вашу программу в определенных точках, например, указав методы, выполняйте некоторый код println при входе или выходе из метода. [AOP имеет гораздо большую цель, чем это простое использование для печати отладочных операторов, но я стараюсь оставаться на цели для ответа на вопрос.]

Эта статья (возможно, несколько устаревшая) показывает пример, аналогичный тому, что вы хотите:

http://www.developer.com/java/other/article.php/3109831/Simplify-your-logging-with-AspectJ.htm

2 голосов
/ 11 мая 2010

Может быть, вам стоит взглянуть на java.reflect.Proxy. Но для этого необходимо создать один прокси на класс, для которого вы хотите отслеживать вызовы методов.

Пример:

    @SuppressWarnings("unchecked")
  public static <T> List<T> traceList(final List<T> list) {
    return (List<T>)Proxy.newProxyInstance(
      ProxyTest.class.getClassLoader(),
      new Class<?>[]{List.class}, 
      new InvocationHandler() {
        public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {
          System.out.println("enter "+method);
          try {
           return method.invoke(list,args);
          } finally {
            System.out.println("exit "+method);
          }
        }
      });
  }
2 голосов
/ 11 мая 2010

Звучит так, будто вам нужно либо аспектно-ориентированное программирование (например, AspectJ ), либо переплетение байт-кода (например, ASM или cglib ).

0 голосов
/ 11 мая 2010

Если вам нужно сделать это только для ваших собственных классов, а не для классов из библиотеки Java или того, что вы получаете от кого-то другого, то это и есть объектно-ориентированное программирование. Создайте свой класс верхнего уровня, поместите в него эту функцию, а затем выведите из него любые другие классы.

...