Not to be pedantic, but the JVM throws that error not the compiler. The compiler runs before you execute the code.
On to reflection. I see a few issues in that code. Compare it to this code:
1) I pass String.class. You are getting the exception because it is looking for retrieveItems() which doesn't exist. My example looks for retrieveItems(String) which does exist.
2) Since the method is not accessible, you need to specifically make it so.
3) I pass service instead of clazz as the object I want to run the method against. Since the method isn't static, it needs the actual instance of the object.
I'm going to move this to our Java in General forum since it is about reflection more than testing.
Method.invoke returns Object. That's because it doesn't know what the method actually returns. Object is the catch-all type. This object will be the actual object returned by the method, in this case your List<String>*. All you need to do is cast it. That will give you a compiler warning because casting with generics is always an unsafe operation.
* If the return type is void then null is returned.