Error de método de reflexión de Android

Estoy tratando de averiguar Reflection con esta clase de 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()); 

El método getKeyguardStoredPasswordQuality se declara como (sin parámetros):

 public int getKeyguardStoredPasswordQuality() { // codes here } 

El error que tengo es:

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

¿Cómo declaro com.android.internal.widget.LockPatternUtils como un receptor?

Está pasando la class a #invoke() lugar de una instancia de LockPatternUtils .

Puede crear una instancia utilizando #newInstance() .

No importa, lo he descubierto. He adaptado los códigos a continuación basados ​​en este tutorial .

En caso de que alguien esté interesado en la solución, aquí está:

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

La solución anterior requiere que el constructor público de la clase LockPatternUtils.java sea ​​definido como:

 public LockPatternUtils(Context context) {...} 

Si el constructor cambia en el futuro (después de 2013), la solución tendrá que ser modificada.

Nota: Lo anterior es un ejercicio para que yo entienda el uso de la Reflexión. Sin embargo, usar Reflection en aplicaciones de producción de Android debe utilizarse con moderación y cuando sea absolutamente necesario.

  • Cómo comprobar qué sim se establece como predeterminado en android programatically
  • Java / Android Método de llamada desde cadena WITH Value
  • Android getOnTouchListener con la versión del API> = 15
  • Field.getGenericType () devuelve la instancia de java.lang.Class en lugar de Type
  • Acceso a campos desde un objeto proxy
  • Interceptar llamadas de método
  • Android Bluetooth no puede conectarse a dispositivos médicos con puerto fijo # - ¿utilizar reflexión de Java?
  • Compruebe si el objeto tiene un método en Java?
  • Invocación de un método privado (no publicado) en la API de Android
  • ¿Cómo utilizar la reflexión para cambiar el servicio de copia de seguridad?
  • Recuperación de una lista de clases de un paquete en un proyecto de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.