Пользователь selig прав: Вы, вероятно, не хотите перехватывать все создания объектов, особенно не в классах JDK/JRE. Но для чего это стоит, вот объяснение того, что работает и как и что нет:
небольшое приложение драйвера:
public class Application {
public static void main(String[] args) {
new Application();
new String();
}
}
Аспект с различными типами конструктора связанных срезов в/совет:
public aspect ObjectCreationAspect {
before() : preinitialization(*.new(..)) && !within(ObjectCreationAspect) {
System.out.println(thisJoinPointStaticPart);
}
before() : initialization(*.new(..)) && !within(ObjectCreationAspect) {
System.out.println(thisJoinPointStaticPart);
}
before() : call(*.new(..)) && !within(ObjectCreationAspect) {
System.out.println(thisJoinPointStaticPart);
}
before() : execution(*.new(..)) && !within(ObjectCreationAspect) {
System.out.println(thisJoinPointStaticPart);
}
}
выход тканого приложения водителя:
call(Application())
preinitialization(Application())
initialization(Application())
execution(Application())
call(java.lang.String())
Объяснение:
Существуют различные виды ткачества в AspectJ:
- Compile времени соткать (CTW): Только классы, которые составитель AJC (AspectJ компилятор) можно соткать. Это исключает классы JDK/JRE, а также сторонние библиотеки, которые вы не компилируете из источника. выход образца сверху показывает эффект ткачества во время компиляции.
- Бинарное ткачество (BW): Компилятор AspectJ используется для компиляции кода аспекта непосредственно в существующий байт-код. Это работает с вашими предварительно скомпилированными классами приложений, а также с сторонними библиотеками. Теоретически он также работает с классами JDK/JRE, если вы положили rt.jar на путь компилятора AspectJ. Плетение JDK/JRE немного сложно, но я сделал это раньше. Вы можете создать новую тканую версию rt.jar или просто небольшой JAR-файл с несколькими сплетенными JDK-классами, которые затем приступают к загрузке класса JDK/JRE при запуске приложения.
- Нагрузочное время (LTW): В основном это BW, но выполняется динамически во время загрузки класса. В этом сценарии AspectJ вы можете переплести только классы, которые загружаются загрузчиком классов под воздействием искателя. Таким образом, он работает с вашим собственным кодом и сторонними библиотеками, но обычно не с классами начальной загрузки JDK/JRE, которые загружаются до загрузки загрузчика. Это проблема типа «курица и яйцо»: ткач нуждается в JRE для запуска, прежде чем он может быть загружен, но для того, чтобы сплести классы JRE, ткач должен был быть там до того, как эти классы будут загружены.
Теперь то, что вы легко можете сделать, это перехват вызовов к JDK/JRE конструкторам из вашего собственного кода Одера тканого третий кода партии, как вы можете видеть на выход журнала линии, говоря call(java.lang.String())
. Однако вы не можете перехватывать внутренние вызовы из класса JRE классу JRE.
Сказав все, что я действительно задаюсь вопросом, какую ужасную вещь вы хотите сделать. Я имею в виду, вы объясняете это, и это звучит как потрясающая ошибка дизайна. Или вы хотите заново изобрести колесо и написать какой-то профилировщик или отладчик, который уже существует. Что вы ожидаете от перехвата создания каждого объекта? Это значительно замедлит ваше приложение, резко увеличит потребление памяти и создаст еще больше объектов, если только строки, которые вы регистрируете. Пожалуйста, передумайте и попытайтесь подумать о том, что вы действительно хотите сделать. Возможно, тогда мы можем предложить разумный способ достижения вашей цели.
Есть ошибки? Не могли бы вы более подробно рассказать о функции mal? – JEY
нет нет ошибок. просто создание объекта не вызывает советы .. Извините, я не понимаю, что такое функция «mal»? Я только что понял, что создание других объектов не инициализирует конструктор Object, потому что это было бы бесполезно в любом случае. Мне нужно будет найти другой способ, как указывать все создания объектов. – Marosh