инструментариум на байт код към естествени функции на Java

Използвам asm за инструментиране на байт код в java функция. Има ли начин да направите същото за собствените функции на jre? Може би начин за обвиване на родната функция с функция на Java?

Моята цел в края е да получа списък на всички функции, които са се изпълнявали с техните аргументи.


person Shay    schedule 09.12.2013    source източник


Отговори (1)


Тъй като методите native са декларирани във файла на класа, можете да ги замените както всеки друг метод. Сложната част е как да извикате оригиналния метод. За да постигнете това, можете да създадете друг native метод, който ще бъде свързан с оригиналния native код.

Това трябва да се случи по време на зареждане, тъй като повечето JVM не поддържат добавяне на методи след това. Има функция, която да ви помогне да свържете вашия нов помощен метод с оригиналния код, префикс на родния метод. документацията на Instrumentation.setNativeMethodPrefix обяснява подробностите.

person Holger    schedule 09.12.2013
comment
Преодолях този проблем, тъй като исках да обвия някои sun.misc.Unsafe местни методи. Класът се зарежда доста рано, така че не може да бъде първоначално дефиниран с опакованите местни кодове. Донесох това тук: mail.openjdk.java. net/pipermail/serviceability-dev/2015-June/ - може би някой ще има идея. - person eckes; 06.06.2015
comment
@eckes: Инструментите работят само за JNI методи. Някои JRE native методи са само вътрешни, т.е. JVM познава тези методи и замества техните извиквания с вътрешна операция, когато се срещне. Така че за такива методи инструментирането на самия метод не работи, но можете да използвате своя трансформатор, за да замените извикванията с друг код, вместо да модифицирате метода. - person Holger; 08.06.2015
comment
Съгласен съм, инструментариумът работи за JNI методи (чрез обвиването им с префиксна версия). Това обаче не е възможно при вече заредени класове (тъй като те не позволяват добавяне на методи при предефинирането им). Поне аз не знам как. И да, може да не работи за присъщи, но в моя случай Unsafe.allocateMemory() не е присъщ. - person eckes; 09.06.2015