public static Object invokeInstanceMethod(String methodName, Object ownerInstance,
			List<Class<?>> parameterTypes, List<Object> args) throws RuntimeException {

		Class<?>[] parameterTypesArray = new Class[parameterTypes.size()];
		parameterTypes.toArray(parameterTypesArray);
		return invokeInstanceMethod(methodName, ownerInstance, parameterTypesArray, args.toArray());
	}
Uses reflection to execute the method denoted by the given method
name.  If any value is returned from the method execution, then it 
will be returned from this method.  Otherwise, <code>null</code> is returned.
<p>
Note: if the method is static, then the <code>ownerInstance</code> field 
can be the class of the object that contains the method.

<P>This method is just a convenience for calling 
{@link #invokeInstanceMethod(String, Object, Class[], Object[])}.  As the following 
example shows, this method's uses is a bit cleaner:
<PRE>
 	// The call below is equivalent to calling: <CODE> System.out.println("Hi")
	invokeInstanceMethod("println", System.out, Arrays.asList(String.class), Arrays.asList("Hi"));
	</CODE>
</PRE>

@param methodName The name of the method to execute.
@param ownerInstance The object instance of which the method will be
       executed.
@param parameterTypes The parameter <b>types</b> that the method takes.
@param args The parameter values that should be passed to the method.
       This value can be null or zero length if there are no parameters
       to pass
@return The return value as returned from executing the method.
@throws RuntimeException if there is a problem accessing the field
        using reflection.  A RuntimeException is used so that calling
        tests can avoid using a try/catch block, but will still fail
        when an error is encountered.
Ghidra/Framework/Generic/src/main/java/generic/test/TestUtils.java