2013-11-02 80 views
5

我想弄清楚的反思與該Android類:Android的反射法錯誤

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()); 

方法getKeyguardStoredPasswordQuality被聲明爲(無參數):

public int getKeyguardStoredPasswordQuality() { 
    // codes here 
} 

我得到的錯誤是:

Exception: java.lang.IllegalArgumentException: expected receiver of type com.android.internal.widget.LockPatternUtils, but got java.lang.Class<com.android.internal.widget.LockPatternUtils> 

如何申報com.android.internal.widget.LockPatternUtils作爲接收器?

回答

10

您正在通過class#invoke()而不是LockPatternUtils的實例。

您可以使用#newInstance()創建一個實例。

+0

你能對你的解答爲這樣'對象clazz中= c.newInstance()擴展;'然後傳遞'Object對象= method.invoke(clazz所)clazz中;'只會工作,如果被引用類的構造函數是空的。在類的構造函數被定義爲'public LockPatternUtils(Context context){..}'的情況下,你做了什麼? – ChuongPham

+0

我會通過向'newInstance'方法展示doco來標記你的答案是正確的。謝了哥們。 – ChuongPham

+0

@ChuongPham:當然,有一些限制,但它們記錄在API鏈接到的API中。 – Keppil

1

沒關係,我已經知道了。我已根據此tutorial修改了以下代碼。

如果有人有興趣的解決方案,那就是:

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(); 

上述解決方案要求LockPatternUtils.java類的公共構造函數被定義爲:

public LockPatternUtils(Context context) {...} 

如果構造未來的變化(2013年後),解決方案將需要修改。

注:以上是我瞭解Reflection的用法的練習。但是,在使用Android製作應用程序時,應該謹慎使用Reflection並在絕對需要時使用。

+0

我不得不稍微改變代碼來得到它我的Andorid 5.1.1設備上運行,並得到正確的構造用過的。 只好改變if(constructor.getGenericParameterTypes()。length == 0) – FunkSoulBrother