final void fireProbe(long probeId, @Sensitive Object instance, @Sensitive Object target, @Sensitive Object payload) {
        try {
            //new Exception().printStackTrace();
            ProbeImpl probe = activeProbesById.get(probeId);
            ConcurrentMap<ProbeImpl, Set<ProbeListener>> listenersByProbe = this.listenersByProbe;
            if (shuttingDown || listenersByProbe == null || probe == null) {
                return;
            }
            Set<ProbeListener> listeners = listenersByProbe.get(probe);
            if (listeners == null) {
                return;
            }
            for (ProbeListener listener : listeners) {
                try {
                    Method method = listener.getTargetMethod();
                    //Class<?>[] parameterTypes = method.getParameterTypes();
                    Class<?>[] parameterTypes = listener.getParameterTypes();
                    //Annotation[][] parameterAnnotations = method.getParameterAnnotations();
                    //Annotation[][] parameterAnnotations = listener.getparameterannotations();//Performance Improvement
                    Object[] args = listener.getdefaultvalues();
                    if (args != null)
                        args = Arrays.copyOf(args, args.length);
                    boolean validated = listener.isValidated();
                    ArrayList<Integer> annList = listener.getAnnotationsList();
                    for (int i = 0; i < parameterTypes.length; i++) {

                        switch (annList.get(i)) {
                            case MonitorConstants.This:
                                if (validated || parameterTypes[i].isInstance(instance)) {
                                    args[i] = instance;
                                }
                                break;
                            case MonitorConstants.Args:
                                if (validated || Object[].class.isInstance(payload)) {
                                    args[i] = payload;
                                }
                                break;
                            case MonitorConstants.Elapsed:
                                break;
                            case MonitorConstants.Returned:
                                if (validated || parameterTypes[i].isInstance(payload)) {
                                    args[i] = payload;
                                }
                                break;
                            case MonitorConstants.FieldValue:
                                if (parameterTypes[i].isInstance(payload)) {
                                    args[i] = payload;
                                }
                                break;
                            case MonitorConstants.TargetInstance:
                                if (parameterTypes[i].isInstance(target)) {
                                    args[i] = target;
                                }
                                break;
                            case MonitorConstants.TargetMember:
                                break;
                            case MonitorConstants.Thrown:
                                if (Throwable.class.isInstance(payload) && parameterTypes[i].isInstance(payload)) {
                                    args[i] = payload;
                                }
                                break;
                            case MonitorConstants.Arg:
                                break;
                            default:
                                break;
                        }
//Below code causes performance overhead ..specifically the instanceof tag is causing overhead hence using switch case which is based on
//                        structures built the ProbeListener constructor
//                        Annotation[] annotations = parameterAnnotations[i];
//                        for (Annotation a : annotations) {
//                            if (a instanceof This) {
//                                if (parameterTypes[i].isInstance(instance)) {
//                                    System.out.println("i is " + i + " ins is This");
//                                    args[i] = instance;
//                                }
//                            } else if (a instanceof Args) { // @Args
//                                // payload instance of Object[] and Object[] can be assigned to parameter
//                                if (Object[].class.isInstance(payload) && parameterTypes[i].isAssignableFrom(Object[].class)) {
//                                    args[i] = payload;
//                                }
//                            }
//                            else if (a instanceof Elapsed) {
//                                // TODO
//                                System.out.println("elapsed");
//                                //args[i] = getDefaultValue(parameterTypes[i]);
//                            } else if (a instanceof Returned) {
//                                System.out.println("Returned");
//                                if (parameterTypes[i].isInstance(payload)) {
//                                    args[i] = payload;
//                                }
//                            } else if (a instanceof FieldValue) {
//                                System.out.println("FieldValue");
//                                if (parameterTypes[i].isInstance(payload)) {
//                                    args[i] = payload;
//                                }
//                            } else if (a instanceof TargetInstance) {
//                                System.out.println("TargetInstance");
//                                if (parameterTypes[i].isInstance(target)) {
//                                    args[i] = target;
//                                }
//                            } else if (a instanceof TargetMember) {
//                                System.out.println("TargetInstance");
//                                // TODO
//                                // args[i] = getDefaultValue(parameterTypes[i]);
//                            } else if (a instanceof Thrown) {
//                                System.out.println("Thrown");
//                                if (Throwable.class.isInstance(payload) && parameterTypes[i].isInstance(payload)) {
//                                    args[i] = payload;
//                                }
//                            } else if (a instanceof Arg) { // @Arg(n)
//                                System.out.println("Arg");
//                                Arg arg = (Arg) a;
//                                int index = arg.value() - 1;
//                                Object[] params = null;
//                                if (Object[].class.isInstance(payload)) {
//                                    params = (Object[]) payload;
//                                    if (params.length >= index && parameterTypes[i].isInstance(params[index])) {
//                                        args[i] = params[index];
//                                    }
//                                }
//                            }
//                        }
//                    }
                    }
                    listener.setValidated(true);
                    method.invoke(listener.getProbeTarget(), args);
                } catch (Throwable t) {
                    if (tc.isDebugEnabled()) {
                        Tr.debug(tc, t.getMessage());
                    }
                }
            }
        } catch (Throwable t) {
            Tr.error(tc, "PMI9999E", t.toString());
        }
    }
final void fireProbe ( long probeId , @ Sensitive Object instance , @ Sensitive Object target , @ Sensitive Object payload ) { try { ProbeImpl probe = activeProbesById . get ( probeId ) ; ConcurrentMap < ProbeImpl , Set < ProbeListener > > listenersByProbe = this . listenersByProbe ; if ( shuttingDown || listenersByProbe == null || probe == null ) { return ; } Set < ProbeListener > listeners = listenersByProbe . get ( probe ) ; if ( listeners == null ) { return ; } for ( ProbeListener listener : listeners ) { try { Method method = listener . getTargetMethod ( ) ; Class < ? > [ ] parameterTypes = listener . getParameterTypes ( ) ; Object [ ] args = listener . getdefaultvalues ( ) ; if ( args != null ) args = Arrays . copyOf ( args , args . length ) ; boolean validated = listener . isValidated ( ) ; ArrayList < Integer > annList = listener . getAnnotationsList ( ) ; for ( int i = 0 ; i < parameterTypes . length ; i ++ ) { switch ( annList . get ( i ) ) { case MonitorConstants . This : if ( validated || parameterTypes [ i ] . isInstance ( instance ) ) { args [ i ] = instance ; } break ; case MonitorConstants . Args : if ( validated || Object [ ] . class . isInstance ( payload ) ) { args [ i ] = payload ; } break ; case MonitorConstants . Elapsed : break ; case MonitorConstants . Returned : if ( validated || parameterTypes [ i ] . isInstance ( payload ) ) { args [ i ] = payload ; } break ; case MonitorConstants . FieldValue : if ( parameterTypes [ i ] . isInstance ( payload ) ) { args [ i ] = payload ; } break ; case MonitorConstants . TargetInstance : if ( parameterTypes [ i ] . isInstance ( target ) ) { args [ i ] = target ; } break ; case MonitorConstants . TargetMember : break ; case MonitorConstants . Thrown : if ( Throwable . class . isInstance ( payload ) && parameterTypes [ i ] . isInstance ( payload ) ) { args [ i ] = payload ; } break ; case MonitorConstants . Arg : break ; default : break ; } } listener . setValidated ( true ) ; method . invoke ( listener . getProbeTarget ( ) , args ) ; } catch ( Throwable t ) { if ( tc . isDebugEnabled ( ) ) { Tr . debug ( tc , t . getMessage ( ) ) ; } } } } catch ( Throwable t ) { Tr . error ( tc , "PMI9999E" , t . toString ( ) ) ; } }
Fire the listeners associated with the specified probe identifier.

@param probeId the probe identifier
@param instance the object instance that's the source of the probe
@param payload the probe payload