6

私はこの 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受信者として宣言するにはどうすればよいですか?

4

2 に答える 2

14

のインスタンスの代わりにを渡してclassいます。 #invoke()LockPatternUtils

を使用してインスタンスを作成できます#newInstance()

于 2013-11-02T10:21:22.873 に答える
1

気にしないで、私はそれを理解しました。このチュートリアルに基づいて、以下のコードを適応させました。

誰かがソリューションに興味を持っている場合は、次のとおりです。

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 年以降) コンストラクターが変更された場合は、ソリューションを修正する必要があります。

注: 上記は、リフレクションの使用法を理解するための演習です。ただし、Android の本番アプリで Reflection を使用する場合は、控えめに、絶対に必要な場合に使用する必要があります。

于 2013-11-02T13:11:16.867 に答える