¿Se puede usar la reflexión con métodos que pertenecen a un sdk mayor que el mínimo?

Estoy desarrollando una aplicación que tiene que soportar a nivel mínimo 10 sdk. Hoy en día, estaba codificando cuando me encontré con un método setLayerType() que tengo que usar. Pero este método se introduce en el nivel 11 de la API . Por lo tanto, he utilizado una solución y utiliza Reflection para utilizar este método.

Por lo tanto, mi pregunta es, ¿no mi aplicación sigue bloqueando en el dispositivo que se ejecuta en el nivel de API 10?

Esta pregunta vino a mi mente porque, aunque estoy usando Reflection aquí, todavía, estoy llamando a un método que fue introducido en el API nivel 11 . ¿Este método se ejecutará correctamente cuando ejecute mi aplicación en dispositivos Android que se ejecutan en el nivel 10 de la API o se bloquean?

Como se indica en la fuente , el método se ejecutará independientemente del nivel de OS. Pero, ¿por qué se debe ejecutar con éxito en el dispositivo de nivel 10 de API que todavía está usando Android.jar de API de nivel 10 y ese archivo ni siquiera contiene este método?

Traté de buscarlo pero no pude encontrar una explicación.

PS Quería probarlo en un dispositivo con API de nivel 10, pero como construir una aplicación completa tardará algún tiempo, por lo que no es posible probar la aplicación en el dispositivo de nivel 10 de API ahora mismo.

No, por supuesto la aplicación se bloqueará si llama a un método que no está presente en su nivel de API. Esto es verdad si llamas por reflexión o no.

El punto de la reflexión es que usted elige si o no llamarlo basado en el nivel de la API. Compare http://developer.android.com/reference/android/os/Build.VERSION.html#SDK_INT a http://developer.android.com/reference/android/os/Build.VERSION_CODES.html en su código y sólo proceda con la llamada reflectante si el número SDK es lo suficientemente alto.

El punto es que aislar código con referencias de bytecode a cualquier método o constante o clase que no esté presente en todos los niveles de API en una clase separada que sólo se carga por reflexión.

He aquí un ejemplo de algún código de utilidad que creé para manejar este tipo de cosas; carga una u otra implementación de una interfaz basada en el nivel de API:

https://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/common/PlatformSupportManager.java?spec=svn2361&r=2361

EDIT: La respuesta de @ FD_ también funciona lo que me sorprende. La reflexión es más segura, pero mucho más código. Y parece que el enfoque de la reflexión es de hecho innecesario en los últimos, si no todos, Android JVM.

Ni siquiera necesitas Reflexión para eso. Simplemente especifique su sdk objetivo lo más alto posible, y su min sdk tan bajo como lo es ahora. Luego, antes de llamar a un método que se introdujo después de la versión min, simplemente compruebe la versión de api que está ejecutando su aplicación:

 if (android.os.Build.VERSION.SDK_INT >= 11) { //Your code here } 

Intentar utilizar métodos que se introdujeron en una versión posterior de api conducirá a un fallo de lo contrario, ya sea que lo llame usando Reflection o no.

  • Obtener "java.lang.reflect.InvocationTargetException" al intentar registrar receptor de difusión de apk incrustado
  • Clase personalizada que carga / reemplaza las clases nativas de Android
  • Call class 'constructor por reflexión con Kotlin
  • Protección contra la reflexión - android
  • Cargador de clases personalizado para android?
  • Reglas de ProGuard para la reflexión de Kotlin
  • Recuperación de una lista de clases de un paquete en un proyecto de Android
  • Cómo acceder a setPreferredNetworkType en la fuente de Android
  • Java / Android Método de llamada desde cadena WITH Value
  • Android Java objModelClass.getClass (). GetDeclaredFields () devuelve "$ change" como un campo
  • Invocación de un método privado (no publicado) en la API de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.