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.

Necesito crear una instancia de android.print.PrintDocumentAdapter.LayoutResultCallback

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.

  • Cómo moverse repetición similar-variable en declaraciones if
  • Cómo comprobar qué sim se establece como predeterminado en android programatically
  • Métodos de reflexión no funcionan cuando se utiliza proguard para la aplicación de Android
  • Recuperación de una lista de clases de un paquete en un proyecto de Android
  • Anotación personalizada de Java y carga dinámica
  • BackupAgent compatible con versiones anteriores
  • ¿Se puede usar la reflexión con métodos que pertenecen a un sdk mayor que el mínimo?
  • Android / Java: ¿Llamar a un método usando reflexión?
  • Reflexión de Java para el método estático privado con parámetros
  • Android getOnTouchListener con la versión del API> = 15
  • Java Reflection - Obtener todos los nombres de variables de instancia de una clase
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.