2010-12-16 16 views
10

ejemplos salida deseada:¿Cómo generar la firma del método?

(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node; 
(Ljava/lang/String;)Lorg/w3c/dom/Attr; 

Estas firmas pueden generarse utilizando la utilidad javap:

javap -s -p org.w3c.dom.Node 

Pero ¿hay alguna manera de generar mediante programación. No quiero codificar manualmente todas las reglas de la especificación jni.

+0

um, es eso? –

+0

¿Qué? birryree

+0

@bemace, @birryre. Perdón por no ser claro, agregué más detalles. – alex2k8

Respuesta

1

Una vez estaba tratando de crear este tiempo atrás acerca de la generación de la firma de método, Recuerdo haber hecho esto siguiendo el estilo, pero no estoy seguro que es una tranquila mucho tiempo

1) He escrito mi propia clase para generar el método signature 2) He utilizado la clase de reflexión para obtener el método Names dinámicamente.

espero que esto puede ayudarle a obtener una idea, si no es la solución completa para su problema

+0

Es difícil ver cómo esto califica como una respuesta. – EJP

0

usuario de la biblioteca ASM de ObjectWeb. No solo es rápido, sino que también puede optar por atravesar la clase

4

http://asm.ow2.org/asm31/javadoc/user/org/objectweb/asm/Type.html#getMethodDescriptor%28java.lang.reflect.Method%29, que proporciona exactamente el resultado esperado.

Nota oftálmica a los fines de completar: En mi caso de uso, necesitaba también la conversión a la inversa. Esto se puede lograr con los métodos Type.getArgumentTypes (sig) y Type.getReturnType (sig). Los elementos de matriz resultantes del tipo Tipo proporcionan el método getClassName() desde el que se obtiene la clase de referencia a través de Class.forName o clase primitiva a través de simple declaración o mapa.

0
I generate like this: 

private static String calculateMethodSignature(Method method){ 
     String signature = ""; 
     if(method != null){ 
      signature += "("; 
      for(Class<?> c:method.getParameterTypes()){ 
       String Lsig = Array.newInstance(c,1).getClass().getName(); 
       signature += Lsig.substring(1); 
      } 
      signature += ")"; 

      Class<?> returnType = method.getReturnType(); 
      if(returnType == void.class){ 
       signature += "V"; 
      }else{ 
       signature += Array.newInstance(returnType,1).getClass().getName(); 
      } 

      signature = signature.replace('.','/'); 
     } 

     return signature; 
    } 
+0

No todos los parámetros o tipos de retorno son una matriz ... pero algunos sí lo son. – EJP

+0

Sí ... simplemente ignore la firma del array '[' delante de la cadena ... –

+0

¡excelente idea! Me pregunto por qué OP no ha aceptado esto como la respuesta. – user3911119

Cuestiones relacionadas