1. Se pueden agregar cadenas a la declaración condicional del cambio. El método consiste en utilizar el valor hashcode () de la cadena para obtener el valor real.
2. Se agregó un sistema base que se puede usar en literales, binarios, agregando "0b" o "0B" delante del número.
3. Utilice guiones bajos en literales numéricos para separar los números y facilitar la lectura sin afectar el tamaño del valor. El principio básico es que los subrayados sólo pueden aparecer si hay números antes y después de ellos.
4.java7 ha realizado dos cambios en las excepciones:
4.1 Admite la captura de múltiples excepciones al mismo tiempo en una cláusula de captura, y la otra es hacer que el tipo de excepción sea más preciso al capturar y volver a lanzar excepciones. El método addSuppressed se agregó a la clase Throwable en Java 7. Cuando se lanza una excepción, es posible que se supriman otras excepciones debido a la excepción y, por lo tanto, no se pueden lanzar normalmente. En este momento, puede registrar estos métodos suprimidos a través del método addSuppressed. Las excepciones suprimidas aparecerán en la información de la pila de las excepciones lanzadas. También puede obtener estas excepciones a través del método getSuppressed. La ventaja de esto es que no se perderá ninguna excepción, lo que facilitará las pruebas a los desarrolladores.
Java7 mejora la sintaxis de la cláusula catch, permitiendo especificar múltiples excepciones en ella. Cada tipo de excepción está separada por "|". Cabe señalar que las excepciones capturadas en la cláusula catch no pueden tener tipos repetidos, ni se permite que una de las excepciones sea una subclase de otro parámetro de excepción, de lo contrario ocurrirá un error de compilación (de minúscula a mayúscula, no hay problema). ). Si se declaran varias excepciones en la cláusula catch, el tipo específico del parámetro de excepción es el límite superior mínimo de todos estos tipos de excepción.
4.2 Utilice try (aplicación de recursos) {procesamiento empresarial} para liberar automáticamente recursos que pueden administrarse mediante declaraciones try deben cumplir una condición, es decir, su clase java debe implementar la interfaz java.lang.AutoCloseable; de lo contrario, se producirá un error de compilación. ocurrirá. El método de cierre de esta interfaz se llamará automáticamente cuando sea necesario liberar recursos.
5. Optimice las llamadas a métodos con parámetros de longitud variable:
Una nueva característica introducida en j2se5.0 es permitir el uso de parámetros de longitud variable en las declaraciones de métodos. El último parámetro formal de un método se puede especificar para representar cualquier número de parámetros del mismo tipo. Cuando se llaman, estos parámetros se pasan en forma de matriz. También se puede hacer referencia a estos parámetros como matrices en el cuerpo del método.
6. Java 7 introduce una nueva anotación @SafeVarargs. Si el desarrollador está seguro de que un método que utiliza parámetros de longitud variable no provocará una situación similar cuando se utilice con una clase genérica, puede declararlo con esta anotación. La anotación @SafeVarargs solo se puede usar en métodos o constructores con longitudes de parámetros variables y el método debe declararse estático o final; de lo contrario, se producirá un error de compilación. La premisa para que un método se anote con @SafeVarargs es que el desarrollador debe garantizar que el procesamiento de parámetros de tipo genérico en la implementación de este método no cause problemas de seguridad de tipos.
7.Java admite algunos lenguajes de secuencias de comandos en la máquina virtual Java a través del motor de secuencias de comandos. De hecho, el administrador del motor de secuencias de comandos admite tres métodos de motor de búsqueda, que se completan por nombre, extensión de archivo y tipo MIME. como
7.1 Vinculación de idiomas:
Una gran ventaja de la API de soporte del lenguaje de secuencias de comandos es que estandariza la interacción entre el lenguaje Java y el lenguaje de secuencias de comandos, de modo que los programas escritos en lenguaje Java puedan realizar llamadas a métodos bidireccionales y transferencias de datos con secuencias de comandos. La transferencia de datos se realiza a través de objetos de enlace de lenguaje. El llamado objeto de enlace de lenguaje es una tabla hash simple que se utiliza para almacenar y obtener datos que deben compartirse. Todos los datos corresponden a una entrada en esta tabla hash y son un par simple de nombre-valor. La interfaz javax.script.Bingings define la interfaz de los objetos de enlace del lenguaje, que hereda de la interfaz java.util.Map. Un motor de script puede utilizar varios objetos de enlace de lenguaje durante la ejecución. Diferentes idiomas tienen diferentes alcances para vincular objetos. De forma predeterminada, el motor de script proporcionará múltiples objetos de enlace de lenguaje para almacenar objetos globales generados durante la ejecución. La clase ScriptEnging proporciona métodos put y get para operar en los objetos de enlace de lenguaje predeterminados utilizados específicamente en el motor de script. Los programas pueden usar directamente este objeto de enlace de idioma predeterminado o pueden usar sus propios objetos de enlace de idioma. Durante la ejecución del script, el objeto de enlace del lenguaje se puede considerar como una tabla de mapeo de variables adicional. Los nombres en los objetos de enlace de lenguaje también se tienen en cuenta al analizar los valores de las variables. Las variables globales y otro contenido generado durante la ejecución del script aparecerán en el objeto de enlace del idioma. De esta forma se completa la transferencia de datos bidireccional entre Java y el lenguaje de scripting.
Por ejemplo, se agrega una cadena denominada "nombre" al objeto de enlace de idioma predeterminado del motor de script a través del método put de ScriptEngine, y luego se hace referencia directamente al objeto por nombre en el script. De manera similar, la variable global "mensaje" creada en el script también se puede obtener mediante el método get de ScriptEnging. Esto logra una transferencia de datos bidireccional entre programas y scripts Java. La conversión de tipos durante la transferencia de datos la realiza el motor de secuencias de comandos y las reglas de conversión dependen de la gramática del idioma específico.
En la mayoría de los casos, es suficiente utilizar los métodos put y get de ScriptEnging. Si solo se utilizan los métodos put y get, el objeto de enlace del lenguaje en sí es transparente para el desarrollador. En algunos casos, es necesario utilizar el objeto de enlace de idioma propio del programa. Por ejemplo, el objeto de enlace de idioma contiene los datos únicos del programa. Si desea utilizar su propio objeto de enlace de lenguaje, puede llamar al método creatBingings del motor de secuencias de comandos o crear un objeto javax.script.SimpleBingings y pasarlo al método eval del motor de secuencias de comandos, como por ejemplo:
El objeto de enlace de idioma pasado a través del método eval solo tiene efecto en la llamada de evaluación actual y no cambia el objeto de enlace de idioma predeterminado del motor.
7.2 Contexto de ejecución de script Otra interfaz importante relacionada con la ejecución del motor de script es javax.script.ScriptContext, que contiene información de contexto relevante durante la ejecución del motor de script. Se puede comparar con la interfaz javax.servlet.ServletContext en la especificación de servlet en JavaEE. . El motor de script obtiene información relacionada con la ejecución del script haciendo referencia al objeto de contexto y también permite a los desarrolladores configurar el comportamiento del motor de script a través de este objeto. Los objetos superior e inferior contienen principalmente los siguientes tres tipos de información.
7.2.1 Entrada y salida Primero, se presenta la información de configuración relacionada con la entrada y salida del script, incluido el objeto java.io.Reader utilizado por el script para leer la entrada de datos durante la ejecución y java.io.Writer que genera el contenido correcto y información de error. De forma predeterminada, la entrada y salida del script se producen en la consola estándar. Si desea escribir la salida del script en un archivo, puede utilizar el siguiente código. Redirige la salida del script a un archivo mediante el método setWriter. A través de los métodos setReader y setErrorWriter de ScriptContext, puede configurar respectivamente la fuente de entrada de datos cuando se ejecuta el script y el destino de salida del mensaje de error cuando ocurre un error.
7.2.2 Propiedades personalizadas
ScriptContext también tiene métodos para obtener y configurar atributos similares a los de ServletContext, a saber, setAttribute y getAttribute. La diferencia es que los atributos en ScriptContext tienen un alcance. La diferencia entre diferentes ámbitos es el orden de búsqueda. Cada ámbito utiliza un número entero correspondiente para representar su orden de búsqueda. Cuanto menor sea el valor entero, mayor será la prioridad en el orden de búsqueda. Las propiedades en un ámbito con mayor prioridad ocultarán las propiedades con el mismo nombre en un ámbito con menor prioridad. Por lo tanto, debe especificar explícitamente el alcance al configurar las propiedades. Al obtener atributos, puede optar por buscar en un ámbito específico o puede optar por buscar automáticamente según la prioridad del ámbito.
Sin embargo, el alcance incluido en la implementación del contexto de ejecución del script es fijo. Los desarrolladores no son libres de definir su propio alcance. Se puede obtener una lista de todos los ámbitos disponibles mediante el método getScopes de ScriptContext. Hay dos alcances predefinidos en SciptContext: el alcance representado por la constante ScriptContext.ENGINE_SCOPE corresponde al motor de script actual, y el alcance representado por ScriptContext.GLOBAL_SCOPE corresponde a todos los objetos del motor de script creados desde la misma fábrica de motores. El primero tiene mayor prioridad. Por ejemplo:
7.2.3 Objetos de enlace de idioma
El último tipo de información en el contexto de ejecución del script es el objeto de enlace del lenguaje. Los objetos de enlace de lenguaje también corresponden a ámbitos. El mismo orden de precedencia de alcance se aplica a los objetos vinculados al idioma. Este orden de prioridad tendrá un impacto en la resolución variable durante la ejecución del script. Por ejemplo:
enlaces.put("nombre","Mundo")
motor.eval("println(nombre);");
7.3 Recopilación de guiones:
Los lenguajes de scripting generalmente se interpretan y ejecutan. El motor de script necesita analizar el script antes de ejecutarlo en tiempo de ejecución. En términos generales, ejecutar un script mediante interpretación será más lento que ejecutarlo después de la compilación. Cuando es necesario ejecutar un script varias veces, el script se puede compilar primero. No es necesario analizar repetidamente el script compilado cuando se ejecuta, lo que puede mejorar la eficiencia de la ejecución. No todos los motores de scripts admiten la compilación de scripts. Si un motor de script admite esta característica, implementará la interfaz javax.script.Compilable para declararla. Los usuarios de motores de secuencias de comandos pueden aprovechar esta capacidad para mejorar la eficiencia de las secuencias de comandos que deben ejecutarse varias veces. El motor de secuencias de comandos JavaScript que viene con Java SE admite la compilación de secuencias de comandos.
En el siguiente código, el método de compilación de la interfaz compilable se utiliza para compilar el código del script y el resultado de la compilación está representado por javax.script.CompiledScript. Dado que no todos los motores de secuencias de comandos admiten la interfaz compilable, es necesario utilizar instancia de para juzgar aquí. En el método de ejecución, el script se puede ejecutar mediante el método de evaluación de CompiledScript. En el código, un script se ejecuta repetidamente 100 veces para ilustrar la ventaja de rendimiento del script compilado cuando se ejecuta repetidamente.
ejecución pública vacía (String scriptText) lanza ScriptException {
Script compilado = compilar (scriptText);
si (guión == nulo) {
devolver;
}
para (int i = 0; i < 100; i++) {
script.eval();
}
}
7.4 Llamadas a métodos en scripts En los scripts, los más comunes y prácticos son los métodos. Algunos motores de secuencias de comandos permiten a los usuarios llamar individualmente a un método en una secuencia de comandos. Los motores de script que admiten la invocación de este método pueden implementar la interfaz javax.script.Invocable. A través de la interfaz Invocable, puede llamar a métodos de nivel superior en scripts y métodos miembro en objetos. Si el método de nivel superior en el script o el método miembro en el objeto implementa la interfaz en Java, puede obtener el objeto de implementación de la interfaz Java correspondiente en el script a través del método en la interfaz Invocable. De esta forma, la interfaz se puede definir en lenguaje Java e implementar en el script. Otras partes del programa que utilizan la interfaz no saben que la interfaz está implementada por el script. Al igual que la interfaz compilable, la implementación de ScriptEngine de la interfaz Invocable también es opcional.
El siguiente código llama al método de nivel superior en el script a través de la función invoke de la interfaz Invocable. Los parámetros durante la llamada se pasarán al método en el script. Debido a que el motor de script JavaScript que viene con JavaSE implementa la interfaz Invocable, aquí se omite juzgar si el motor implementa la interfaz Invocalbe. Un ejemplo de cómo llamar al método de nivel superior del script en Java:
//Ejemplo de llamada a métodos miembro de un objeto script en Java
7.5 Implementar la interfaz java en script
En algunos motores de script, la interfaz se puede definir en el lenguaje Java y la implementación de la interfaz se puede escribir en el script. De esta manera, otras partes del programa solo pueden interactuar con la interfaz Java y no necesitan preocuparse por ella. cómo se implementa la interfaz. En el siguiente código, Greet es una interfaz definida en Java, que contiene un método getGreeting. Implemente esta interfaz en el script. A través del método getInterface, puede obtener el objeto de la interfaz implementado por el script y llamar a los métodos que contiene.
Debido a que la sintaxis del lenguaje de secuencia de comandos es simple y flexible, es muy adecuado para usuarios que tienen poca o ninguna experiencia en programación. Estos usuarios pueden usar el lenguaje de secuencia de comandos para personalizar la lógica empresarial y la interfaz de usuario del programa. El lenguaje puede mejorar la facilidad de uso del programa. Se logra un mejor equilibrio entre flexibilidad y flexibilidad. Por ejemplo, el lenguaje de programación Lua se utiliza ampliamente en el desarrollo de juegos para personalizar el comportamiento interno y la interfaz de usuario del juego.
8. Si bien la API de reflexión brinda flexibilidad a los programas Java, también genera costos de rendimiento adicionales. Debido al mecanismo de implementación de la API de reflexión, para la misma operación, como llamar a un método, usar la API de reflexión para implementarlo dinámicamente es más rápido. que ejecutarlo directamente en la fuente. La forma en que se escribe el código es probablemente uno o dos órdenes de magnitud más lenta. Con la mejora de la implementación de la máquina virtual Java, el rendimiento de la API de reflexión ha mejorado enormemente. Sin embargo, esta brecha de rendimiento existe objetivamente. Por lo tanto, en algunas aplicaciones que tienen requisitos de rendimiento relativamente altos, las API de reflexión deben usarse con precaución.