Instancia de clase abstracta con constructor oculto
Necesito crear una instancia de una clase abstracta con constructor oculto, la clase se ve así:
public abstract class TestClass { /** * @hide */ public TestClass() { } }
Crear una clase concreta no funciona, porque el constructor no es visible y llamar al constructor a través de la reflexión API también no funciona porque la clase es abstracta.
- Interceptar llamadas de método
- UnsuppotedOperationException.getCause se devuelve
- ¿Es posible cargar dinámicamente una biblioteca en tiempo de ejecución desde una aplicación de Android?
- Compruebe si el objeto tiene un método en Java?
- Reflexión para un campo que va mal
Necesito crear una instancia de android.print.PrintDocumentAdapter.LayoutResultCallback
- ¿Debo dejar el hack de reflexión bluetooth en código de producción?
- Cómo acceder a setPreferredNetworkType en la fuente de Android
- Error al usar StatusBarManagerService - java.lang.SecurityException en android.permission.STATUS_BAR_SERVICE
- ¿Cómo utilizar la reflexión para cambiar el servicio de copia de seguridad?
- Clase personalizada que carga / reemplaza las clases nativas de Android
- Error de método de reflexión de Android
- Detectar videollamada entrante en android
- ¿Se considera reflexión y en qué grado?
Me encontré exactamente con el mismo problema (por precisamente la misma clase incluso) y tengo una solución mejor que reemplazar el android.jar con framework.jar como se sugiere en la otra respuesta.
La solución utiliza la biblioteca dexmaker . (Necesitará dexmaker.1.4.jar y dexmaker-dx.1.4.jar). Esta es una biblioteca que genera bytecode en tiempo de ejecución para la VM de Dalvik (la VM usada en android).
Esta biblioteca tiene una clase llamada ProxyBuilder
que genera un proxy para una clase abstracta. El proxy es un objeto que extiende la clase abstracta e implementa los métodos enviándolos a una instancia de java.lang.reflect.InvocationHandler
que especifique.
ProxyBuilder
es casi idéntico a java.lang.refect.Proxy
, excepto que java.lang.refect.Proxy
sólo funciona para interfaces, mientras que ProxyBuilder ProxyBuilder
trabaja para clases abstractas, que es lo que necesitamos para nuestro problema.
El código es todo de:
public static PrintDocumentAdapter.LayoutResultCallback getLayoutResultCallback(InvocationHandler invocationHandler, File dexCacheDir) throws IOException{ return ProxyBuilder.forClass(PrintDocumentAdapter.LayoutResultCallback.class) .dexCache(dexCacheDir) .handler(invocationHandler) .build(); }
La lógica de devolución de llamada se implementa en el invocationHandler
que proporciona. El cacheDir
es un directorio donde dexmaker puede almacenar algunos archivos.
Este tutorial parece dirigirse a cómo hacer lo que está pidiendo: https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/ . Yo nunca he hecho esto yo mismo, así que no puedo dar fe de ello.
Advertencia: existe una razón por la que los métodos de la API están ocultos. Lo más importante para los desarrolladores es que no hay garantía de que el método se mantenga durante todo el tiempo ya que el método en cuestión no forma parte de ninguna API pública.
- Mostrar un pequeño popup en el punto donde el usuario hace clic en el gráfico (achartengine)
- ¿Cómo devuelvo un resultado de una tarea asíncrona