void write() { // write field to hold method reference... visitField(ACC_PRIVATE | ACC_STATIC, methodRefName, METHOD_TYPE.getDescriptor(), null, null); visitCode(); // pseudocode: // try { // return methodN.invoke(this, *args); // } catch (InvocationTargetException e) { // throw e.getCause(); // } TryCatch tryCatch = tryStart(INVOCATION_TARGET_EXCEPTION_TYPE); loadOriginalMethodRef(); loadTarget(); loadArgArray(); invokeVirtual(METHOD_TYPE, METHOD$INVOKE); tryCatch.end(); castForReturn(iMethod.getReturnType()); returnValue(); tryCatch.handler(); int exceptionLocalVar = newLocal(THROWABLE_TYPE); storeLocal(exceptionLocalVar); loadLocal(exceptionLocalVar); invokeVirtual(THROWABLE_TYPE, THROWABLE$GET_CAUSE); throwException(); endMethod(); }
arrayStore(CLASS_TYPE); invokeVirtual(CLASS_TYPE, CLASS$GET_DECLARED_METHOD); invokeVirtual(METHOD_TYPE, ACCESSIBLE_OBJECT$SET_ACCESSIBLE);
void write() { // write field to hold method reference... visitField(ACC_PRIVATE | ACC_STATIC, methodRefName, METHOD_TYPE.getDescriptor(), null, null); visitCode(); // pseudocode: // try { // return methodN.invoke(this, *args); // } catch (InvocationTargetException e) { // throw e.getCause(); // } TryCatch tryCatch = tryStart(INVOCATION_TARGET_EXCEPTION_TYPE); loadOriginalMethodRef(); loadTarget(); loadArgArray(); invokeVirtual(METHOD_TYPE, METHOD$INVOKE); tryCatch.end(); castForReturn(iMethod.getReturnType()); returnValue(); tryCatch.handler(); int exceptionLocalVar = newLocal(THROWABLE_TYPE); storeLocal(exceptionLocalVar); loadLocal(exceptionLocalVar); invokeVirtual(THROWABLE_TYPE, THROWABLE$GET_CAUSE); throwException(); endMethod(); }
arrayStore(CLASS_TYPE); invokeVirtual(CLASS_TYPE, CLASS$GET_DECLARED_METHOD); invokeVirtual(METHOD_TYPE, ACCESSIBLE_OBJECT$SET_ACCESSIBLE);