Assinatura ou descritores de argumento
Para descrever os tipos de um atributo ou dos métodos de um objeto, a linguagem Java utiliza as assinaturas de argumento, também conhecida como descritores de membros (member descriptor).
Uma assinatura de argumento é uma string C que contem o tipo de um membro (atributos ou métodos) da uma classe.
ex.: “Ljava/lang/String;” indica que é um atributo do tipo java.lang.String
Note que os tipos primitivos são representados apenas com letras. As assinaturas de argumento (ou descritores) são definidas a seguir:
| Caractere BaseType |
Tipo | Descrição |
| B | byte | byte assinalado |
| C | char | caractere Unicode |
| D | double | valor de ponto de flutuação de precisão dupla |
| F | float | valor de ponto de flutuação de precisão única |
| I | int | inteiro |
| J | long | inteiro longo |
| L; | Reference | uma instância da classe |
| S | short | short assinalado |
| Z | boolean | true ou false |
| [ | Reference | uma dimensão de matriz |
Para saber mais detalhes, consulte o capítulo 4.3.2, Field Descriptors, na Especificação do Sun VM
Por exemplo, para representar o tipo int usamos “I” e para representar o tipo float “F”.
Porem para representar um array usamos um “[” ao lado do tipo.
ex.: para representar um int[] usamos “[I” e para representar um double[][] usamos “[[D”.
Por último para representarmos uma classe usamos o prefixo L seguido do nome completo da classe terminando com “;“.
ex.: para representarmos uma classe java.util.Date usamos “Ljava/util/Date;”
Note que substituíamos os . por /.
Assim como os atributos, os métodos também possuem uma assinatura de argumento e neste caso para representá-los colocamos primeiro os argumentos do método entre parênteses e depois o seu retorno.
ex.: Para o método: public int getWidth(); Teremos como assinatura de argumento: “()I” e não “(V)I”.
Ou ainda para o método: public void getWidth(int w);
Teremos como assinatura “(I)V”, isso é para mostrarmos que na assinatura do retorno podemos colocar V.
Outro exemplo um pouco mais complexo:
public java.lang.String formatDate(java.util.Date) Sua assinatura seria do tipo “(Ljava/util/Date;)Ljava/lang/String;”
Se um método receber vários parâmetros podemos colocá-los um seguido do outro sem nenhum separador:
ex.: public int soma(int a, int b) Sua assinatura seria “(II)I”
Agora vamos imaginar que tenhamos recebido uma classe Java, ou que não saibamos qual a assinatura para determinado método ou atributo, como podemos descobri-lo?
A melhor maneira de fazê-lo é utilizando o javap, um desassemblador de classes Java, o javap consegue abrir e ler uma classe Java e listar as assinaturas de argumento de seus atributos e métodos, entre outras coisas.
O javap fica na pasta bin do seu JDK e podemos utilizá-lo da seguinte forma:
javap[-opções] minhaClasse
Sendo que para listar as assinaturas de argumento usamos a opção –s, que informa ao javap que o mesmo deve mostrar as assinaturas no formato JNI e não as assinaturas no formato Java, e para incluímos as assinaturas dos métodos e atributos do tipo private usamos a opção –p.
Caso queria saber um pouco mais sobre o javap consulte sua documentação no site da SUN.
ex.:
Executando javap para a classe InstanceMethodCall:
% javap -s -p InstanceMethodCall
Teríamos como saída:
… private callback ()V public static main ([Ljava/lang/String;)V private native nativeMethod ()V …
Uma vez que tenhamos a assinatura do argumento podemos passá-la para as funções como, por exemplo:
FindClass
Protótipo:
tipo_array = (*env)->FindClasse(env, “[I”);
Agora que já sabemos um pouco mais sobre as assinaturas de argumento vamos para o próximo passo "Acessando os atributos de um objeto".
Comments are off for this post





