Java Android反射方法错误

Java Android反射方法错误,java,android,reflection,Java,Android,Reflection,我试图通过这个安卓类了解反射: Class<?> c = Class.forName("com.android.internal.widget.LockPatternUtils"); Method method = c.getDeclaredMethod("getKeyguardStoredPasswordQuality"); method.setAccessible(true); Object object = method.invoke(c); // Error with thi

我试图通过这个安卓类了解反射:

Class<?> c = Class.forName("com.android.internal.widget.LockPatternUtils");
Method method = c.getDeclaredMethod("getKeyguardStoredPasswordQuality");
method.setAccessible(true);
Object object = method.invoke(c); // Error with this line
result = object.toString());
我得到的错误是:

Exception: java.lang.IllegalArgumentException: expected receiver of type com.android.internal.widget.LockPatternUtils, but got java.lang.Class<com.android.internal.widget.LockPatternUtils>
Exception:java.lang.IllegalArgumentException:应为com.android.internal.widget.LockPatternUtils类型的接收方,但获得了java.lang.Class

如何将
com.android.internal.widget.LockPatternUtils
声明为接收者?

您将
传递给
#invoke()
,而不是
LockPatternUtils
的实例


您可以使用创建实例。

没关系,我已经解决了。我已经根据这一点修改了下面的代码

如果有人对解决方案感兴趣,请参阅:

Class<?> c = Class.forName("com.android.internal.widget.LockPatternUtils");
Constructor<?>[] constructors = c.getDeclaredConstructors();
Constructor<?> constructor = null;
for (int i = 0; i < constructors.length; i++) {
   constructor = constructors[i];
   if (constructor.getGenericParameterTypes().length == 0)
      break;
}
constructor.setAccessible(true);
Object clazz = constructor.newInstance(context, true);
Method method = clazz.getClass().getDeclaredMethod("getKeyguardStoredPasswordQuality");
Object object = method.invoke(clazz);
result = object.toString();
如果未来(2013年后)构造器发生变化,则需要修改解决方案


注意:以上是我理解反射用法的练习。然而,在Android生产应用程序中使用反射应该尽量少用,并且在绝对需要的时候使用。

你能在这样做的时候扩展你的答案吗
Object clazz=c.newInstance()
然后在
objectobject=method.invoke(clazz)中传递clazz仅在引用类的构造函数为空时才起作用。如果类的构造函数被定义为
public-LockPatternUtils(Context-Context){..}
,您会怎么做?我将通过向我显示
newInstance
方法的doco来标记您的答案为正确。谢谢,伙计。@ChuongPham:当然,有一些限制,但它们都记录在我链接到的API中。在不使用newInstance()的情况下使用get()方法时,也会发生同样的错误。所以它应该是:
MyObj v=(MyObj)field.get(clazz.newInstance())我必须稍微更改代码,使其在我的Andorid 5.1.1设备上运行,并使用正确的构造函数。必须更改(constructor.getGenericParameterTypes().length==0)
Class<?> c = Class.forName("com.android.internal.widget.LockPatternUtils");
Constructor<?>[] constructors = c.getDeclaredConstructors();
Constructor<?> constructor = null;
for (int i = 0; i < constructors.length; i++) {
   constructor = constructors[i];
   if (constructor.getGenericParameterTypes().length == 0)
      break;
}
constructor.setAccessible(true);
Object clazz = constructor.newInstance(context, true);
Method method = clazz.getClass().getDeclaredMethod("getKeyguardStoredPasswordQuality");
Object object = method.invoke(clazz);
result = object.toString();
public LockPatternUtils(Context context) {...}