Prefácio
Todo mundo sabe que, com o uso do Java8, um novo parâmetro de objeto foi adicionado à assinatura do método correspondente para representar informações específicas do parâmetro. O nome do parâmetro correspondente pode ser obtido através de seu nome GetName. Ou seja, como escrito no código, como o nome de usuário, ao passar os parâmetros em primeiro plano, não há necessidade de escrever anotações como a classe @parameter ("nome de usuário"), mas pode mapear diretamente o nome.
A seguinte referência de código é mostrada:
public class T {Interface privada T2 {Void Método (Nome de usuário da String, String senha); } public static void main (string [] args) lança exceção {System.out.println (t.class.getMethod ("main", string []. classe) .getParameters () [0] .getName ()); System.out.println (t2.class.getMethod ("método", string.class, string.class) .getParameters () [0] .getName ()); System.out.println (t2.class.getMethod ("método", string.class, string.class) .getParameters () [1] .getName ()); }} Antes do Java8, você também pode obter informações sobre o nome do parâmetro por alguns meios, mas os métodos são diferentes. Por exemplo, ParameterMethodNameResolver no MVC da primavera também pode funcionar normalmente em versões anteriores. No entanto, requer apenas compilação especial. O que funciona aqui são LocalVariableTable e MethodParameters , que são compilados em tabelas variáveis locais e tabelas de parâmetros de método em chinês.
Tabela de variável local localVariAbleTable
De acordo com a especificação da JVM, a tabela de variáveis local existe no atributo de código e o atributo de código também é um atributo do MethodInfo. Pode -se entender que, quando um método tem um corpo de método, o atributo de código correspondente será exibido. No atributo de código, além da execução específica do código, haverá outras informações. Por exemplo, lineNumberTable (usado para descrever a localização de cada linha de código).
A tabela variável local faz parte das informações de depuração no método; portanto, por padrão, essas informações não serão geradas no arquivo de classe. Os interruptores -g ou -g: vars precisam ser ativados. Felizmente, para compilação IDE ou Maven, esses comutadores são ativados por padrão. No IDE, você pode controlá -lo configurando (gerar informações de depuração para a ideia) (verificação padrão). No MAVEN, se a saída é controlada por depuração ou depuração do plug-in maven-compiler-plugin (o valor padrão é verdadeiro).
A tabela variável local é após o Javap, como segue:
// Método não estáático LocalvariAbletable: Iniciar Nome do slot Slot Signature 0 1 0 Este LT; 0 1 1 contagem j 0 1 3 Nome ljava/lang/string; // Método estático LocalVariAbleTable: Iniciar o nome do comprimento da assinatura 0 101 0 args [ljava/lang/string;
A tabela variável local não apenas salva informações de parâmetros, mas também armazena variáveis temporárias que podem ser usadas em todo o corpo do método, como o declarado int i, etc. e, como mostrado acima, o método e o método não estático têm uma diferença entre essa variável na primeira posição. Portanto, você pode ler o número de parâmetros ( method.getParameterCount ) e, em seguida, ler as informações do parâmetro do número especificado na tabela de variáveis local de acordo com a assinatura do método.
Deve -se notar que, na figura acima, se o parâmetro for longo ou duplo, seu slot ocupa 2 locais. Ao obter informações de parâmetro através do slot, as informações do tipo de parâmetro precisam ser consideradas.
Como o método da interface não possui atributo de código, não há tabela de variável local. Se você obtiver a definição do método de uma interface, não poderá obter o nome do parâmetro correspondente através da tabela de variável local.
MethodParameters Método Tabela
A tabela de parâmetros do método foi introduzida após 1.8, portanto, essas informações estão disponíveis apenas nos arquivos de classe compilados com o JDK8. Ao contrário da tabela variável local, ela pertence ao atributo MethodInfo, ou seja, está no mesmo nível que o atributo de código. Seja um método de interface ou um método comum, ele possui esse atributo. Portanto, mesmo um método de interface pode obter as informações de parâmetros correspondentes.
Por padrão, essas informações não estão disponíveis na classe. É necessário um parâmetro especial de compilação -parâmetros para gerar, e essas informações não são geradas por padrão na Idea e Maven. Na idéia, esse parâmetro de compilação precisa ser adicionado nos parâmetros de linha adicionais Java. No MAVEN, esse parâmetro precisa ser adicionado no parâmetro compilerArgs do maven-compiler-plugin.
A tabela de parâmetros do método é mostrada na forma a seguir após o Javap:
// Método não-estático MethodParameters: Nome sinalizadores Count Name // Método estático MétodoParameters: Nome sinalizadores args
Pode -se observar que, seja estático ou não, apenas as informações usadas para descrever os parâmetros aparecerão na tabela de parâmetros. O parâmetro de sinalizadores subsequentes é usado em alguns cenários especiais, como parâmetro final para reescrita de métodos, etc.
Algumas ferramentas disponíveis
Além de usar APIs nativas e kits de ferramentas de mola, existem outras ferramentas que podem obter informações sobre o nome do parâmetro. No sistema de primavera, a interface usada para descrever nomes de parâmetros é ParameterNameDiscoverer . Através dele, as informações de nome do parâmetro correspondentes podem ser obtidas. Além disso, o paranâmero no com.thoughtworks.paranamer:paranamer Kit de ferramentas também pode processar informações correspondentes. No entanto, o suporte para o MethodParameter JDK8 não é muito alto e os usuários podem atingir seus próprios objetivos, estendendo -o.
Resumir
O acima é o método de obter as informações do nome do parâmetro do método no código resumido por Java. Espero que seja útil para todos aprenderem ou usarem Java. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar.