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) {...}