boolean (DebugProcessImpl process, Method method, @Nullable StackFrameProxyImpl stackFrame) { try { String signature = method.signature(); if (stackFrame != null && signature != null && signature.endsWith(PROXY_CALL_SIGNATURE_POSTFIX)) { String methodName = method.name(); boolean match = false; // standard if ("invoke".equals(methodName)) { ReferenceType type = method.declaringType(); if ((type instanceof ClassType) && ((ClassType)type).interfaces().stream().map(InterfaceType::name).anyMatch("java.lang.reflect.InvocationHandler"::equals)) { match = true; } } if (DebuggerUtilsEx.isLambdaName(methodName)) { match = true; } else { ObjectReference thisObject = stackFrame.thisObject(); if (thisObject != null && StringUtil.containsIgnoreCase(thisObject.referenceType().name(), "CGLIB")) { match = true; } } if (match) { List<Value> argumentValues = stackFrame.getArgumentValues(); int size = argumentValues.size(); if (size >= 3) { Value proxyValue = argumentValues.get(size - 3); if (proxyValue != null) { Type proxyType = proxyValue.type(); if (proxyType instanceof ReferenceType && DebuggerUtilsEx.isAssignableFrom(myDeclaringClassName.getName(process), proxyType)) { Value methodValue = argumentValues.get(size - 2); if (methodValue instanceof ObjectReference) { // TODO: no signature check for now ReferenceType methodType = ((ObjectReference)methodValue).referenceType(); return myTargetMethodName.equals( ((StringReference)((ObjectReference)methodValue).getValue(methodType.fieldByName("name"))).value()); } } } } } } } catch (EvaluateException e) { LOG.info(e); } return false; }