Сценарий:
У меня есть набор исходных файлов для классов, интерфейсов и перечислений в одном пакете, например:
package com.mycompany.data;
class Dog {
// implementation
}
package com.mycompany.data;
class Cat {
// implementation
}
package com.mycompany.data;
enum Gender {
// gender options
}
package com.mycompany.data;
interface Animal {
// methods
}
// ... plus a lot more concrete classes and a few more interfaces ...
Цель: реализовать во всех классах новый интерфейс и новый метод.
Проблема: я могу успешно вплести интерфейс в классы и исключить перечисления, но я не могу понять, как предотвратить добавление нового интерфейса к интерфейсам в пакете. .
Мой аспект в настоящее время выглядит так:
public aspect SecureAspect {
declare parents: com.mycompany.data.* && !java.lang.Enum+ implements Secure;
// add method from secure interface to everything implementing Secure
}
Что соответствует Dog
, Cat
и Animal
в моем примере.
Ранее я пробовал:
declare parents: com.mycompany.data.* && java.lang.Object+ && !java.lang.Enum+ implements Secure;
потому что Animal.class.getSuperclass() == null
, в отличие от Объекта, но безрезультатно.
Я знаю, что могу решить эту проблему, переместив интерфейсы из пакета (что я с радостью сделаю, если это окажется невозможным), но мне любопытно, есть ли способ исключить интерфейсы, как я сделал с перечисления.
Почти уверен, что это не имеет значения, но я использую плетение во время загрузки с javaagent.