一般的な考え方としては、次のようなことができます。
//invoking a static method (no instance is required)
public Object invoke(final Class<?> clazz, final String name, final Class<?>[] paramTypes, final Object[] args){
return invoke(null, name, paramTypes, args);
}
//invoking a method on an object (instance is required)
public Object invoke(final Object instance, final Class<?> clazz, final String name, final Class<?>[] paramTypes, final Object[] args) throws Exception{
assert clazz != null && name != null : "clazz || method == null";
assert paramTypes.length == args.length : "paramTypes.length != args.length";
Method method;
try{
//to check if the method has been overridden or not
method = clazz.getDeclaredMethod(name, paramTypes);
}catch(NoSuchMethodException | SecurityException ex){
//if method doesn't exist, exception is thrown
method = clazz.getMethod(name, paramTypes);
}
//if method is protected or private
if(!method.isAccessible())
method.setAccessible(true);
return method.invoke(instance, args);
}
呼び出そうとしているメソッドにパラメーターがない場合は、空を渡しますClass<?>[]
(空以外の引数についても同様ですObject[]
)。このメソッドから返されるオブジェクトは、呼び出されたばかりのメソッドの結果です。void
メソッドに戻り値の型 ( )がない場合は、null
が返されます。アイデアは、基本的に、結果を期待どおりのものにキャストすることです。