SemtexGirl

É uma garota dinâmica e de bom gosto, uma garota que explode, que não para e nem aceita um não como resposta.

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

Comments are closed.