Добавить открытый тип статического метода для классов - PullRequest
0 голосов
/ 19 января 2019

в моем проекте у меня есть набор классов (имена и номера которых я не назначаю), к которым я хочу добавить публичный статический метод.

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

public class Foo {
    private static final Logger LOG = LoggerFactor.getLogger(Foo.class);

    public static void main(String[] args) {
        Foo.getLogger().info("works!");
    }
}

Поскольку я считаю, что это сквозная проблема, я думаю, что решил свою проблему с AspectJ здесь, но я не нашел никакой информации о моем сценарии.

Мои вопросы:

  • если это вообще возможно?
  • если да, то как этого достичь?

Мне известно о возможности динамического объявления родителя моих классов, реализующих интерфейс, но затем я застрял, потому что не могу генерировать статические методы в интерфейсе:

public aspect StaticMethodAspect {

    public interface HasStaticMethod {}

    declare parents: ... implements HasStaticMethod;

    public static Logger HasStaticMethod.getLogger() { //aspect error
        ...
    }

}

И я также знаю о этом решении , но оно не соответствует моему требованию о способе вызова метода.

Спасибо за любезный ответ

1 Ответ

0 голосов
/ 20 января 2019

Если вы хотите объявить статические методы или члены через ITD, вам нужно знать имя класса, а это не так. Таким образом, вы застряли в делах, похожих на то, что вы уже нашли, смотрите также мои ответы здесь:

В этих примерах также показано, как вести журнал напрямую из другого аспекта, поскольку обычно ведение журнала также является сквозной задачей. Поэтому, если вы можете избежать регистрации вручную, просто используйте мой подход.

Но если вы определенно хотите иметь статический регистратор для каждого целевого класса и использовать его так, как показано в примере кода, используйте интеграцию AspectJ с обработкой аннотаций , кратко описанную и связано с моим первым ответом в приведенном выше списке. Не стесняйтесь задавать дополнительные вопросы, если вы не понимаете пример кода по обеим ссылкам, которые я там предоставил.

...