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):
- Reflexión de Java para el método estático privado con parámetros
- ¿Cómo obtengo el nombre del método dentro de ese método?
- Instancia de clase abstracta con constructor oculto
- Cómo acceder a setPreferredNetworkType en la fuente de Android
- Android: cambiar el campo final estático privado usando la reflexión de java
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?
- Proguard y reflexión en Android
- UnsuppotedOperationException.getCause se devuelve
- Call class 'constructor por reflexión con Kotlin
- Clase personalizada que carga / reemplaza las clases nativas de Android
- Cómo moverse repetición similar-variable en declaraciones if
- ¿Cómo se crea una instancia de la actividad de Android (con reflexión)?
- Reflexión de Java que maneja cambios de la biblioteca
- Android, ¿cómo borrar la lista de tareas recientes que podría obtener desde el botón Inicio en la mayoría de teléfono? ¿La reflexión es una manera posible?
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.
- Ejecución de un teléfono Android como un servidor web estable (para una secuencia de comandos CGI de Python)
- ¿Cómo copiar o usar bibliotecas nativas con Android Studio Gradle?