Мне нужно применить нативные методы, чтобы сделать простой статический вызов, прежде чем выполнять их нормально.Поскольку методы являются нативными, я должен использовать функцию setNativePrefix и обернуть нативные методы промежуточным вызовом с оригинальной сигнатурой метода.
После того, как я думал, что для этого было сделано простое изменение байт-кода, я получаю StackOverflowError прямо перед выполнением метода-оболочки, даже если стек в основном пуст.Вот мой тестовый класс:
public class SimpleTest {
public static void main(String[] args) throws IOException {
Perf.getPerf().highResCounter();
}
}
Обычно эта программа ничего не выдаёт на консоли.Однако мой инструментированный байт-код выполняет println () перед выполнением нативного метода $ wrapper $ highResCounter ().Это можно увидеть в соответствующем байт-коде класса Perf после инструментирования:
public long highResCounter() {
getstatic PrintStream System.out
ldc String Constant "this is an instrumented println"
invokevirtual void PrintStream.println(String)
aload 0
invokevirtual long Perf.$wrapped$highResCounter()
lreturn
}
public native long $wrapped$highResCounter();
Я новичок в байт-коде Java, поэтому я, вероятно, допустил здесь ошибку.Вот выходные данные программы, которые показывают, что println () выполняется, но где-то после первого invokevirtual вызова StackOverflowError:
this is an instrumented println call
Exception in thread "main" java.lang.StackOverflowError
at com.foo.SimpleTest.main(SimpleTest.java:17)
Что может быть причиной этого StackOverflowError?И как мне это исправить?