版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lg491733638/article/details/44855959
Method method = baseDao.getMethod("insert", new Class[] {
Context.class, String.class });
method.invoke(baseDao, new Object[] { getApplicationContext(),
valStrArrStrings });
第一个方法:
getMethod
public Method getMethod(String name,
Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException
返回一个
Method
对象,它反映此
Class
对象所表示的类或接口的指定公共成员方法。
name
参数是一个
String
,用于指定所需方法的简称。
parameterTypes
参数是按声明顺序标识该方法形参类型的
Class
对象的一个数组。如果
parameterTypes
为
null
,则按空数组处理。
-
如果
name
是 "<init>
;" 或 "<clinit>
",则将引发NoSuchMethodException
。否则,要反映的方法由下面的算法确定(设 C 为此对象所表示的类):- 在 C 中搜索任一匹配的方法。如果找不到匹配的方法,则将在 C 的超类上递归调用第 1 步算法。
- 如果在第 1 步中没有找到任何方法,则在 C 的超接口中搜索匹配的方法。如果找到了这样的方法,则反映该方法。
注意,类中可以有多个匹配方法,因为尽管 Java 语言禁止类声明带有相同签名但不同返回类型的多个方法,但 Java 虚拟机并不禁止。这增加了虚拟机的灵活性,可以用来实现各种语言特性。例如,可以使用桥方法 (brige method)实现协变返回;桥方法以及将被重写的方法将具有相同的签名,不同的返回类型。
请参阅Java 语言规范 第 8.2 和 8.4 节。
-
- 参数:
-
name
- 方法名 -
parameterTypes
- 参数列表 - 返回:
-
与指定的
name
和parameterTypes
匹配的Method
对象
第二个方法:
invoke
public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
-
对带有指定参数的指定对象调用由此
Method
对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。如果底层方法是静态的,那么可以忽略指定的
obj
参数。该参数可以为 null。如果底层方法所需的形参数为 0,则所提供的
args
数组长度可以为 0 或 null。如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。
如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。
如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。
-
- 参数:
-
obj
- 从中调用底层方法的对象 -
args
- 用于方法调用的参数