1. Strings podem ser adicionadas à instrução condicional switch. O método consiste em usar o valor hashcode() da string para obter o valor real.
2. Adicionado um sistema base que pode ser usado em literais, binários, adicionando "0b" ou "0B" na frente do número.
3. Use sublinhados em literais numéricos para separar números e facilitar a leitura sem afetar o tamanho do valor. O princípio básico é que os sublinhados só podem aparecer se houver números antes e depois deles.
4.java7 fez duas alterações nas exceções:
4.1. Suporta a captura de múltiplas exceções ao mesmo tempo em uma cláusula catch, e a outra é tornar o tipo de exceção mais preciso ao capturar e relançar exceções. O método addSuppressed foi adicionado à classe Throwable em Java 7. Quando uma exceção é lançada, outras exceções podem ser suprimidas por causa da exceção e, portanto, não podem ser lançadas normalmente. Neste momento, você pode registrar esses métodos suprimidos por meio do método addSuppressed. As exceções suprimidas aparecerão nas informações da pilha das exceções lançadas. A vantagem disso é que nenhuma exceção será perdida, facilitando o teste para os desenvolvedores.
Java7 melhora a sintaxe da cláusula catch, permitindo que múltiplas exceções sejam especificadas nela. Cada tipo de exceção é separado por "|". Ressalta-se que as exceções capturadas na cláusula catch não podem ter tipos repetidos, nem é permitido que uma das exceções seja subclasse de outro parâmetro de exceção, caso contrário ocorrerá um erro de compilação (de letras minúsculas para maiúsculas, não há problema ). Se múltiplas exceções forem declaradas na cláusula catch, o tipo específico do parâmetro de exceção será o limite superior mínimo de todos esses tipos de exceção.
4.2 Use try (aplicativo de recursos) {processamento de negócios} para liberar recursos automaticamente. Os recursos que podem ser gerenciados por instruções try precisam atender a uma condição, ou seja, sua classe java deve implementar a interface java.lang.AutoCloseable, caso contrário, ocorrerá um erro de compilação. ocorrerá. O método close desta interface será chamado automaticamente quando os recursos precisarem ser liberados.
5. Otimize chamadas de método com parâmetros de comprimento variável:
Um novo recurso introduzido no j2se5.0 é permitir o uso de parâmetros de comprimento variável em declarações de métodos. O último parâmetro formal de um método pode ser especificado para representar qualquer número de parâmetros do mesmo tipo. Quando chamados, esses parâmetros são passados na forma de um array. Esses parâmetros também podem ser referenciados como arrays no corpo do método.
6. Java 7 introduz uma nova anotação @SafeVarargs Se o desenvolvedor tiver certeza de que um método que usa parâmetros de comprimento variável não causará uma situação semelhante quando usado com uma classe genérica, ele poderá ser declarado com esta anotação. A anotação @SafeVarargs só pode ser usada em métodos ou construtores com comprimentos de parâmetros variáveis, e o método deve ser declarado estático ou final, caso contrário ocorrerá um erro de compilação. A premissa para um método ser anotado com @SafeVarargs é que o desenvolvedor deve garantir que o processamento de parâmetros de tipo genérico na implementação deste método não cause problemas de segurança de tipo.
7.Java suporta algumas linguagens de script na máquina virtual Java por meio do mecanismo de script. Na verdade, o gerenciador do mecanismo de script oferece suporte a três métodos de mecanismo de pesquisa, que são preenchidos por nome, extensão de arquivo e tipo MIME. como
7.1 Vinculação de idioma:
Uma grande vantagem da API de suporte à linguagem de script é que ela padroniza a interação entre a linguagem Java e a linguagem de script, para que os programas escritos na linguagem Java possam conduzir chamadas de métodos bidirecionais e transferências de dados com scripts. A transferência de dados é feita através de objetos de ligação de linguagem. O chamado objeto de ligação de linguagem é uma tabela hash simples usada para armazenar e obter dados que precisam ser compartilhados. Todos os dados correspondem a uma entrada nesta tabela hash e são um par simples de nome-valor. A interface javax.script.Bingings define a interface dos objetos de ligação de linguagem, que herda da interface java.util.Map. Um mecanismo de script pode usar vários objetos de ligação de linguagem durante a execução. Linguagens diferentes têm escopos diferentes para vincular objetos. Por padrão, o mecanismo de script fornecerá vários objetos de ligação de linguagem para armazenar objetos globais gerados durante a execução. A classe ScriptEnging fornece métodos put e get para operar nos objetos de ligação de linguagem padrão usados especificamente no mecanismo de script. Os programas podem usar diretamente esse objeto de ligação de linguagem padrão ou podem usar seus próprios objetos de ligação de linguagem. Durante a execução do script, o objeto de ligação de linguagem pode ser considerado como uma tabela adicional de mapeamento de variáveis. Os nomes em objetos de ligação de linguagem também são levados em consideração ao analisar valores de variáveis. Variáveis globais e outros conteúdos gerados durante a execução do script aparecerão no objeto de ligação de linguagem. Desta forma, a transferência bidirecional de dados entre Java e a linguagem de script é concluída.
Por exemplo, uma string chamada "nome" é adicionada ao objeto de ligação de linguagem padrão do mecanismo de script por meio do método put do ScriptEngine e, em seguida, o objeto é referenciado diretamente pelo nome no script. Da mesma forma, a variável global “mensagem” criada no script também pode ser obtida através do método get de ScriptEnging. Isso permite a transferência bidirecional de dados entre programas e scripts Java. A conversão de tipo durante a transferência de dados é concluída pelo mecanismo de script e as regras de conversão dependem da gramática do idioma específico.
Na maioria dos casos, usar os métodos put e get do ScriptEnging é suficiente. Se apenas os métodos put e get forem usados, o próprio objeto de ligação da linguagem será transparente para o desenvolvedor. Em alguns casos, é necessário usar o objeto de ligação de linguagem do próprio programa. Por exemplo, o objeto de ligação de linguagem contém os dados exclusivos do próprio programa. Se quiser usar seu próprio objeto de ligação de linguagem, você pode chamar o método creatBingings do mecanismo de script ou criar um objeto javax.script.SimpleBingings e passá-lo para o método eval do mecanismo de script, como:
O objeto de ligação de linguagem passado pelo método eval só entra em vigor na chamada eval atual e não altera o objeto de ligação de linguagem padrão do mecanismo.
7.2 Contexto de execução do script Outra interface importante relacionada à execução do mecanismo de script é javax.script.ScriptContext, que contém informações de contexto relevantes durante a execução do mecanismo de script. Ela pode ser comparada com a interface javax.servlet.ServletContext na especificação do servlet em JavaEE. . O mecanismo de script obtém informações relacionadas à execução do script referenciando o objeto de contexto e também permite que os desenvolvedores configurem o comportamento do mecanismo de script por meio desse objeto. Os objetos superiores e inferiores contêm principalmente os três tipos de informações a seguir.
7.2.1 Entrada e Saída Primeiro, as informações de configuração relacionadas à entrada e saída do script são introduzidas, incluindo o objeto java.io.Reader usado pelo script para ler a entrada de dados durante a execução e o java.io.Writer que gera o conteúdo correto e informações de erro. Por padrão, a entrada e a saída do script ocorrem no console padrão. Se desejar gravar a saída do script em um arquivo, você pode usar o código a seguir. Redirecione a saída do script para um arquivo por meio do método setWriter. Através dos métodos setReader e setErrorWriter de ScriptContext, você pode definir respectivamente a fonte de entrada de dados quando o script é executado e o destino de saída da mensagem de erro quando ocorre um erro.
7.2.2 Propriedades personalizadas
ScriptContext também possui métodos para obter e definir atributos semelhantes aos do ServletContext, ou seja, setAttribute e getAttribute. A diferença é que os atributos em ScriptContext têm escopo definido. A diferença entre os diferentes escopos é a ordem de pesquisa. Cada escopo usa um número inteiro correspondente para representar sua ordem de pesquisa. Quanto menor for o valor inteiro, maior será a prioridade na ordem de pesquisa. As propriedades em um escopo com prioridade mais alta ocultarão as propriedades com o mesmo nome em um escopo com prioridade mais baixa. Portanto, você precisa especificar explicitamente o escopo ao definir as propriedades. Ao obter atributos, você pode optar por pesquisar em um escopo especificado ou por pesquisar automaticamente com base na prioridade do escopo.
No entanto, o escopo incluído na implementação do contexto de execução do script é fixo. Os desenvolvedores não são livres para definir seu próprio escopo. Uma lista de todos os escopos disponíveis pode ser obtida através do método getScopes do ScriptContext. Existem dois escopos predefinidos no SciptContext: o escopo representado pela constante ScriptContext.ENGINE_SCOPE corresponde ao mecanismo de script atual e o escopo representado por ScriptContext.GLOBAL_SCOPE corresponde a todos os objetos do mecanismo de script criados na mesma fábrica de mecanismos. O primeiro tem maior prioridade. Por exemplo:
7.2.3 Objetos de ligação de linguagem
O último tipo de informação no contexto de execução do script é o objeto de ligação de linguagem. Os objetos de ligação de linguagem também correspondem a escopos. A mesma ordem de precedência de escopo se aplica a objetos vinculados a linguagem. Esta ordem de prioridade terá impacto na resolução variável durante a execução do script. Por exemplo:
binds.put("nome","Mundo")
motor.eval("println(nome);");
7.3 Compilação de scripts:
As linguagens de script geralmente são interpretadas e executadas. O mecanismo de script precisa analisar o script antes de executá-lo em tempo de execução. De modo geral, executar um script por meio de interpretação será mais lento do que executá-lo após a compilação. Quando um script precisa ser executado várias vezes, ele pode ser compilado primeiro. O script compilado não precisa ser analisado repetidamente quando executado, o que pode melhorar a eficiência da execução. Nem todos os mecanismos de script suportam a compilação de scripts. Se um mecanismo de script suportar esse recurso, ele implementará a interface javax.script.Compilable para declarar isso. Os usuários de mecanismos de script podem aproveitar esse recurso para melhorar a eficiência de scripts que precisam ser executados diversas vezes. O mecanismo de script JavaScript que acompanha o Java SE oferece suporte à compilação de scripts.
No código a seguir, o método de compilação da interface Compilable é usado para compilar o código do script, e o resultado da compilação é representado por javax.script.CompiledScript. Como nem todos os mecanismos de script suportam a interface Compilable, instanceof precisa ser usado para julgamento aqui. No método run, o script pode ser executado através do método eval do CompiledScript. No código, um script é executado repetidamente 100 vezes para ilustrar a vantagem de desempenho do script compilado quando executado repetidamente.
public void run(String scriptText) lança ScriptException {
Script CompiledScript = compile(scriptText);
if (script == nulo) {
retornar;
}
for (int i = 0; i < 100; i++) {
script.eval();
}
}
7.4 Chamadas de métodos em scripts Em scripts, os mais comuns e práticos são os métodos. Alguns mecanismos de script permitem que os usuários chamem individualmente um método em um script. Os mecanismos de script que suportam essa invocação de método podem implementar a interface javax.script.Invocable. Através da interface Invocable, você pode chamar métodos de nível superior em scripts e métodos membros em objetos. Se o método de nível superior no script ou o método membro no objeto implementar a interface em Java, você poderá obter o objeto de implementação da interface Java correspondente no script por meio do método na interface Invocável. Desta forma, a interface pode ser definida na linguagem Java e implementada no script. Outras partes do programa que usam a interface não sabem que a interface é implementada pelo script. Assim como a interface Compilable, a implementação da interface Invocable pelo ScriptEngine também é opcional.
O código a seguir chama o método de nível superior no script por meio da chamadaFunction da interface Invocable. Os parâmetros durante a chamada serão passados para o método no script. Como o mecanismo de script JavaScript que vem com JavaSE implementa a interface Invocable, o julgamento sobre se o mecanismo implementa a interface Invocalbe é omitido aqui. Um exemplo de chamada do método de nível superior do script em Java:
//Exemplo de chamada de métodos membros do objeto script em Java
7.5 Implementar interface java em script
Em alguns mecanismos de script, a interface pode ser definida na linguagem Java e a implementação da interface pode ser escrita no script. Dessa forma, outras partes do programa só podem interagir com a interface Java e não precisam se preocupar. como a interface é implementada. No código a seguir, Greet é uma interface definida em Java, que contém um método getGreeting. Implemente esta interface no script. Através do método getInterface, você pode obter o objeto da interface implementada pelo script e chamar os métodos nele.
Como a sintaxe da linguagem de script é simples e flexível, ela é muito adequada para usuários com pouco ou nenhum conhecimento de programação. Esses usuários podem usar a linguagem de script para personalizar a lógica de negócios e a interface do usuário do programa. a linguagem pode melhorar a facilidade de uso do programa. Um melhor equilíbrio é alcançado entre flexibilidade e flexibilidade. Por exemplo, a linguagem de script Lua é amplamente utilizada no desenvolvimento de jogos para personalizar o comportamento interno e a interface do usuário do jogo.
8. Embora a API de reflexão traga flexibilidade aos programas Java, ela também incorre em custos adicionais de desempenho. Devido ao mecanismo de implementação da API de reflexão, para a mesma operação, como chamar um método, usar a API de reflexão para implementá-lo dinamicamente é mais rápido. do que executá-lo diretamente na fonte. A maneira como o código é escrito é provavelmente uma a duas ordens de magnitude mais lenta. Com a melhoria da implementação da máquina virtual Java, o desempenho da API de reflexão foi bastante melhorado. No entanto, esta lacuna de desempenho existe objetivamente. Portanto, em algumas aplicações que possuem requisitos de desempenho relativamente altos, as APIs de reflexão devem ser usadas com cautela.