Я пытался использовать структуру ASM для внедрения байт-кода в интересующее меня место, и до сих пор мне это удавалось. В настоящее время я пытаюсь внедрить код, который в основном создает новый экземпляр/объект класса, и, немного прочитав, я обнаружил, что это может быть достигнуто с помощью INVOKESPECIAL (надеюсь, я правильно понял INVOKESPECIAL «INVOKESPECIAL для частных методов и конструкторов»).
Ниже приведен фрагмент кода, который я использовал для создания экземпляра
visitor.visitLdcInsn(System.currentTimeMillis());
visitor.visitLdcInsn(System.currentTimeMillis());
visitor.visitLdcInsn(_type);
visitor.visitVarInsn(ALOAD, metanamevarindex);
eventObject = newLocal(Type.getType("com/vish/RequestTrackerEvent"));
visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "com/vish/RequestTrackerEvent", "<init>",
"(JJLjava/lang/String;Ljava/lang/String;)V");
visitor.visitVarInsn(ASTORE, eventObject);
Конструктор класса принимает 4 аргумента (long, long, String, String). Но всякий раз, когда я это делаю, я получаю исключение, как показано ниже.
java.lang.VerifyError: JVMVRFY036 stack underflow;
at java.lang.J9VMInternals.verifyImpl(Native Method)
at java.lang.J9VMInternals.verify(J9VMInternals.java:72)
at java.lang.J9VMInternals.verify(J9VMInternals.java:70)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:134)
Может ли кто-нибудь помочь мне понять, правильно ли мое использование/понимание INVOKESPECIAL, если правильно, то где я делаю неправильно?
Спасибо