1 Что могут инструменты Java? Самый большой эффект?
Это позволяет разработчикам создавать независимый от приложений агент для мониторинга и помощи программам, работающим на JVM, и, что более важно, для замены и изменения определений определенных классов;
Самая большая роль: он может реализовать реализацию АОП, поддерживаемую на уровне виртуальной машины;
2 Какие изменения поддерживает Java Instrument в JDK 1.5 и 1.6?
JDK 1.5: поддержка статического инструмента, то есть для статической установки инструмента перед запуском JVM;
JDK 1.6: поддержка динамического инструмента, то есть динамическая установка инструмента после запуска JVM, поддержка собственного кода инструмента, поддержка динамически изменяющегося пути к классам;
3 На каком механизме JVM основана реализация Java Instrument? Что такое JVMTI и что он может делать?
- На основе агента JVMTI;
- JVMTI: набор агентных механизмов, набор локальных программных интерфейсов, предоставляемых для инструментов, связанных с JVM;
- JVMTI может поддерживать сторонние инструментальные программы для подключения и доступа к JVM через прокси, а также использовать богатый программный интерфейс, предоставляемый JVMTI, для выполнения многих функций, связанных с JVM;
4 Когда время выполнения методов premain и agentmain в Instrument?
- Время предварительного выполнения: при запуске JVM функция инициализации eventHandlerVMinit вызовет метод loadClassAndCallPremain класса sun.instrument.instrumentationImpl для выполнения предварительного метода класса, указанного Premain-Class;
- Время выполнения Agentmain: после запуска JVM подключите инструмент через VirtualMachine, например: vm.loadAgent(jar), он вызовет метод loadClassAndCallAgentmain класса sun.instrument.instrumentationImpl для выполнения метода agentmain класса, указанного в Agentmain-класс;
5 Что представляют два параметра agentArgs и inst в методах premain и agentmain инструмента? Каков будет эффект каждого?
- agentArgs: входной параметр в командной строке программы-агента, который передается вместе с "-javaagent". В отличие от основной функции, этот параметр представляет собой строку, а не массив строк;
- inst: экземпляр java.lang.instrument.Instrumentation, который автоматически передается JVM и интегрирует почти все функциональные методы, такие как: операции с классами, операции с путями к классам и т. д.;
6 Что такое java.lang.instrument.ClassFileTransformer и что он делает?
- Метод преобразования в ClassFileTransformer может работать и изменять определение класса;
- Прежде чем байт-код класса будет загружен в JVM, JVM вызовет метод ClassFileTransformer.transform для изменения определения класса и реализации функции АОП.По сравнению с технологиями реализации АОП, такими как динамический прокси-сервер JDK и CGLIB, новые классы генерироваться не будут. , и новые классы генерироваться не будут.Исходный класс не должен иметь интерфейс;
7 Как динамически подключить агент для выполнения метода agentmain?
Подключите инструмент через VirtualMachine, например: vm.loadAgent(jar);
8 Список параметров META-INF/MAINFEST.MF?
- Premain-Class: укажите имя класса, содержащего метод premain;
- Agent-Class: укажите имя класса, содержащего метод agentmain;
- Boot-Class-Path: указывает список путей, которые ищет загрузчик классов загрузки. После того, как специфичный для платформы механизм поиска классов дает сбой, загрузчик классов начальной загрузки ищет эти пути;
- Can-Redefine-Class: можно ли переопределить класс, требуемый этим прокси, по умолчанию — false;
- Can-Retransform-Class: может ли класс, требуемый этим прокси, быть повторно преобразован, значение по умолчанию — false;
- Can-Set-Native-Method-Prefix: может ли быть установлен собственный префикс метода, требуемый этим прокси, значение по умолчанию — false;
9 Два основных API ClassFileTransformer, Instrumentation?
- ClassFileTransformer: определяет класс предварительной обработки перед загрузкой класса;
- Инструментарий: Энхансер
(1) добавить/удалитьTransformer: добавить/удалить ClasFileTransformer;
(2) retransformerClasses: укажите, какие классы в случае загрузки повторно преобразовываются, то есть запускают перезагрузку определения класса; для перезагруженных классов старое объявление класса не может быть изменено, например: атрибуты не могут быть добавлены, и методы не могут быть изменены, объявление и т.д.;
(3) redefineClasses: укажите, какие классы запускать перезагрузку определений классов.Отличие от вышеизложенного состоит в том, что обработка преобразования не будет выполняться снова, а байт-код результата обработки будет напрямую передан JVM;
(4) getAllLoadedClasses: получить текущую загруженную коллекцию классов;
(5) getInitiatedClasses: получить определения классов, загруженные определенным загрузчиком классов;
(6) getObjectSize: получить размер пространства, занимаемого объектом;
(7) appendToBootstrapClassLoaderSearch/appentToSystemClassLoaderSearch: увеличьте путь поиска BootstrapClassLoader/SystemClassLoader;
(8) isNativeMethodPrefixSupported/SetNativeMethodPrefix: определите, поддерживает ли JVM перехват собственного метода;
10 Как работает инструмент Java?
- Когда JVM запускается, передайте параметр JVM -javaagent, перейдите в jar-файл агента, и загрузится инструментальный агент;
- При инициализации агента инструмента регистрируется функция инициализации JVMTI eventHandlerVMinit;
- При запуске JVM вызывается функция инициализации eventHandlerVMinit, запускается агент Instrument, а метод loadClassAndCallPremain в классе sun.instrument.instrumentationImpl используется для инициализации метода premain класса, указанного Premain-Class;
- Функция инициализации eventHandlerVMinit регистрирует функцию ClassFileLoadHook для анализа класса;
- Перед синтаксическим анализом класса JVM вызывает функцию ClassFileLoadHook JVMTI, функция ловушки вызывает метод преобразования в классе sun.instrument.instrumentationImpl и, наконец, вызывает метод преобразования нашего пользовательского класса Transformer через метод преобразования TransformerManager;
- Поскольку байт-код изменяется перед синтаксическим анализом класса, поток данных измененного байт-кода используется вместо этого напрямую и, наконец, входит в синтаксический анализ класса, который не влияет на синтаксический анализ всего класса;
- Перезагрузите класс и снова выполните шаги 5-6;