Saltar al contenido

Funciones del lenguaje Java 7 con Android

Solución:

Si esta usando Estudio de Android, el Java 7 idioma debe habilitarse automáticamente sin ningún parche. Try-with-resource requiere API nivel 19+, y faltan elementos de NIO 2.0.

Si no puede usar las funciones de Java 7, consulte la respuesta de @ Nuno sobre cómo editar su build.gradle.

Lo siguiente es solo para interés histórico.


Ciertamente, una pequeña parte de Java 7 se puede usar con Android (nota: solo he probado en 4.1).

En primer lugar, no podría usar el ADT de Eclipse porque está codificado de forma rígida que solo los compiladores 1.5 y 1.6 de Java son compatibles. Puede volver a compilar ADT, pero creo que no hay una forma sencilla de hacerlo aparte de volver a compilar todo el Android.

Pero no es necesario utilizar Eclipse. Por ejemplo, Android Studio 0.3.2, IntelliJ IDEA CE y otros IDE basados ​​en javac admiten la compilación en Android y podría configurar el cumplimiento incluso hasta Java 8 con:

  • Archivo → Estructura del proyecto → Módulos → (elija el módulo en el segundo panel) → Nivel de idioma → (elija “7.0 – Diamantes, ARM, captura múltiple, etc.”)

Habilitación de Java 7 en IntelliJ

Esto solo permite Java 7 características del idioma, y apenas puede beneficiarse de nada, ya que la mitad de la mejora también proviene de la biblioteca. Las funciones que puede utilizar son aquellas que no dependen de la biblioteca:

  • Operador de diamante (<>)
  • Interruptor de cuerda
  • Captura múltiple (catch (Exc1 | Exc2 e))
  • Subrayar en literales numéricos (1_234_567)
  • Literales binarios (0b1110111)

Y estas funciones no se pueden utilizar todavía:

  • los try-con-declaración de recursos – porque requiere la interfaz no existente “java.lang.AutoCloseable” (esto se puede usar públicamente en 4.4+)
  • La anotación @SafeVarargs – porque “java.lang.SafeVarargs” no existe

… “todavía” 🙂 Resulta que, aunque la biblioteca de Android tiene como objetivo 1.6, la fuente de Android contiene interfaces como AutoCloseable y las interfaces tradicionales como Closeable hereda de AutoCloseable (SafeVarargs realmente falta, sin embargo). Podríamos confirmar su existencia mediante la reflexión. Están ocultos simplemente porque el Javadoc tiene la @hide , lo que provocó que “android.jar” no los incluyera.

Ya hay una pregunta existente ¿Cómo creo el SDK de Android con las API internas y ocultas disponibles? sobre cómo recuperar esos métodos. Solo necesitas reemplazar la referencia existente “android.jar” de la Plataforma actual con nuestra personalizada, luego muchas de las API de Java 7 estarán disponibles (el procedimiento es similar al de Eclipse. Verifique la Estructura del proyecto → SDK).

Además de AutoCloseable, (solo) el siguiente Java 7 características de la biblioteca también se revelan:

  • Constructores de encadenamiento de excepciones en ConcurrentModificationException, LinkageError y AssertionError
  • los static Métodos .compare () para primitivas: Boolean.compare (), Byte.compare (), Short.compare (), Character.compare (), Integer.compare (), Long.compare ().
  • Moneda: .getAvailableCurrencies (), .getDisplayName () (pero sin .getNumericCode ())
  • BitSet: .previousSetBit (), .previousClearBit (), .valueOf (), .toLongArray (), .toByteArray ()
  • Colecciones: .emptyEnumeration (), .emptyIterator (), .emptyListIterator ()
  • AutoCloseable
  • Throwable: .addSuppressed (), .getSuppressed () y el constructor de 4 argumentos
  • Carácter: .compare (), .isSurrogate (), .getName (), .highSurrogate (), .lowSurrogate (), .isBmpCodePoint () (pero sin .isAlphabetic () y .isIdeographic ())
  • Sistema: .lineSeparator () (¿indocumentado?)
  • java.lang.reflect.Modifier: .classModifiers (), .constructorModifiers (), .fieldModifiers (), .interfaceModifiers (), .methodModifiers ()
  • Interfaz de red: .getIndex (), .getByIndex ()
  • InetSocketAddress: .getHostString ()
  • InetAddress: .getLoopbackAddress ()
  • Registrador: .getGlobal ()
  • ConcurrentLinkedDeque
  • AbstractQueuedSynchronizer: .hasQueuedPredecessors ()
  • DeflaterOutputStream: los 3 constructores con “syncFlush”.
  • Deflater: .NO_FLUSH, .SYNC_FLUSH, .FULL_FLUSH, .deflate () con 4 argumentos

Eso es básicamente todo. En particular, NIO 2.0 no existe y Arrays.asList todavía no es @SafeVarargs.

EDITAR: En el momento en que se escribió esto, la última versión fue Android 9 y Eclipse Indigo. Las cosas han cambiado desde entonces.

  • Respuesta practica

Sí, lo he intentado. Pero esta no es una gran prueba ya que la compatibilidad se limitó al nivel 6 sin forma (al menos ninguna forma simple) de usar realmente Java 7:

  • Primero instalé un JDK7 en una máquina que no tenía otro JDK instalado; Eclipse y Android tampoco están instalados:

El 7 es el único instalado en esta máquina

  • Luego instalé un nuevo Eclipse Indigo y verifiqué que en realidad estaba usando el JDK 7 (bueno, como este es el único y como este es el que he seleccionado, me hubiera sorprendido)

El 7 es el único utilizado por este Eclipse.

  • Luego instalé la última versión del SDK de Android (EDITAR: Honeycomb, API13, en el momento en que se escribió esta publicación). Encontró mi JDK 7 y se instaló correctamente. Lo mismo para ADT.

  • Pero tuve una sorpresa al intentar compilar y ejecutar una aplicación de Android Hello Word. La compatibilidad se estableció en Java 6 sin forma de forzarla a Java 7:

La compatibilidad está limitada a Java 6

  • Intenté con un proyecto que no era de Android, uno normal de Java, y tenía la explicación. El nivel de compatibilidad parece estar limitado por Eclipse (vea el mensaje en la parte inferior de la siguiente imagen):

Eclipse se limita a la compatibilidad de nivel 6

Así que tuve Hola Mundo que funcionan, y también otras aplicaciones, más complicadas y que usan SQLite, Listview, Sensor y Camera, pero esto solo demuestra que el manejo de compatibilidad de Java 7 parece estar bien hecho y funcionando con Android.

Entonces, ¿alguien intentó con la buena y vieja Ant, evitar la limitación de Eclipse que se vio arriba?

  • Respuesta teórica

De todos modos, el SDK está diseñado para usarse con Java 5 o 6, como se explica aquí.

Puede que tengamos algo que funcione con Java 7, pero funcionaría “por accidente”. La construcción del DEX puede funcionar correctamente o no, y una vez construido el DEX, puede funcionar o no. Esto se debe a que el uso de un JDK no calificado da resultados impredecibles por definición.

Incluso si alguien ha construido con éxito una aplicación de Android bajo Java 7 simple, esto no califica el JDK. El mismo proceso aplicado a otra aplicación puede fallar o la aplicación resultante puede tener errores relacionados con el uso de ese JDK. No recomendado.

Para aquellos que están involucrados en el desarrollo de aplicaciones web, esto es exactamente lo mismo que implementar una aplicación web construida bajo Java 5 o 6 bajo un servidor de aplicaciones calificado solo para Java 4 (digamos Weblogic 8, por ejemplo). Esto puede funcionar, pero esto no es algo que se pueda recomendar para otros fines que no sean intentarlo.

Cita de dalvikvm.com:

dx, incluido en el SDK de Android, transforma los archivos Java Class de las clases Java compiladas por un compilador Java normal en otro formato de archivo de clase (el formato .dex)

Eso significa que el archivo fuente .java no importa, es solo el código de bytes .class.

Hasta donde yo sé, solo invocado dinámico se agregó al código de bytes de JVM en Java 7, el resto es compatible con Java 6. El lenguaje Java en sí no usa invocado dinámico. Otras funciones nuevas, como el cambiar declaración usando Cuerdas o el multi-captura son solo azúcar sintético y no requieren cambios de código de bytes. Por ejemplo, elcaptura solo copia el captura-bloque para cada posible excepción.

El único problema debería ser que las nuevas clases introducidas en Java 7 faltan en Android, como AutoCloseable, por lo que no estoy seguro de que pueda usar el tratar-con función de recursos (¿alguien lo probó?).

¿Algún comentario sobre eso? ¿Me estoy perdiendo de algo?

Si te gustó nuestro trabajo, tienes la habilidad dejar una sección acerca de qué te ha gustado de esta reseña.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *