使用invoke时,有时其第一个参数为空。查了一下大部分答案都说如果反射的方法是static时,可以为空。其他情况下,参数需为类对象的实例,但测试发现参数是类对象,而不是类实例。
Method forName = Class.class.getDeclaredMethod("forName", String.class);
Class<?> vmRuntimeClass = (Class<?>) forName.invoke(null, "dalvik.system.VMRuntime");
看定义可以知道forName是static的方法,所以第一个参数可以为空
static fun forName( name: String, initialize: Boolean, loader: ClassLoader? ): Class<*>
其他情况使用时,发现传入的其实是类对象,而不是类对象实例,例子如下
Method forName = Class.class.getDeclaredMethod("forName", String.class);
Class<?> vmRuntimeClass = (Class<?>) forName.invoke(null, "dalvik.system.VMRuntime");
Method getRuntime = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "getRuntime", null);
getDeclaredMethod方法invoke时返回的传入的是vmRuntimeClass是类对象,而不是类实例。
(Class.forName返回的是类对象,而不是类对象实例)。