settitle - Calcular la firma de una función Java
programacion android pdf 2018 (6)
¿Hay una manera de calcular la firma del método de una clase de Java? Una firma
like ([Ljava/lang/String;)V
representa una función que toma un String[]
como argumento
y devuelve void
.
¿Cuál es la regla para calcular la firma?
De la JLS, §8.4.2 :
8.4.2 Firma del método
La firma de un método consiste en el nombre del método y el número y tipos de parámetros formales del método. Una clase no puede declarar dos métodos con la misma firma, o se produce un error en tiempo de compilación.
El ejemplo:
class Point implements Move { int x, y; abstract void move(int dx, int dy); void move(int dx, int dy) { x += dx; y += dy; } }
provoca un error en tiempo de compilación porque declara dos métodos de
move
con la misma firma. Esto es un error aunque una de las declaraciones seaabstract
.
Así que la "regla" es
el nombre del método y el número y tipos de parámetros formales del método
Puede encontrar esta información en la Especificación de la máquina virtual de Java.
Siempre es un conjunto de paréntesis que incluye significantes de tipo para los argumentos, uno después del otro sin comas ni nada, seguido de un significante de tipo para el valor de retorno después del período de cierre. Es bastante sencillo.
Hay una tabla de firmas de tipo en esta página:
Signature Java Type
Z boolean
B byte
C char
S short
I int
J long
F float
D double
V void
L fully-qualified-class ; fully-qualified-class
[ type type[]
Esos dos últimos significan que para nombrar una clase, usted dice, por ejemplo, Ljava/lang/Object;
, y para nombrar una matriz de (por ejemplo) int
, usted dice [I
, y una matriz de matriz de int
es [[I
Si quisiera literalmente calcular la firma en código Java basado en la reflexión, sería lo suficientemente simple; solo use la tabla anterior con reglas para manejar objetos y arreglos.
Simplemente ejecute javap -s <class-name>
en la carpeta que contiene los archivos .class
. Te lo dirá con 100% de precisión. No hay necesidad de adivinar estas cosas.
Una búsqueda rápida en Google descubrió esta página web:
http://www.rgagnon.com/javadetails/java-0286.html
Hay dos partes en la firma. La primera parte se incluye entre paréntesis y representa los argumentos del método. La segunda parte sigue el paréntesis de cierre y representa el tipo de retorno. El mapeo entre el tipo Java y el tipo C es
Type Chararacter boolean Z byte B char C double D float F int I long J object L short S void V array [
Vea http://www.rgagnon.com/javadetails/java-0286.html para algunos detalles.
Básicamente es params, luego devuelve valor.