2010-12-16 367 views
10

Exemples de sortie souhaitées:Comment générer une signature de méthode?

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

Ces signatures peuvent être générées en utilisant l'utilitaire javap:

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

Mais est-il possible de les générer par programme. Je ne veux pas de code manuellement toutes les règles de la spécification jni.

+0

um, c'est ça? –

+0

Quoi? birryree

+0

@bemace, @birryre. Désolé de ne pas être clair, ajouté plus de détails. – alex2k8

Répondre

1

je une fois en train de créer ce long retour de la génération de la signature de la méthode, je me rappelle de ce par le style suivant, mais je ne suis pas sûr son un long temps calme

1) J'ai écrit ma propre classe pour générer la signature de la méthode 2) J'ai utilisé la classe de réflexion pour obtenir dynamiquement les noms de méthodes.

J'espère que cela peut vous aider à obtenir une idée, sinon la solution complète pour votre problème

+0

Difficile de voir comment cela qualifie comme une réponse. – EJP

0

utilisateur ASM Library of ObjectWeb. Ce n'est pas seulement rapide mais vous pouvez avoir le choix de traverser à travers la classe

4

http://asm.ow2.org/asm31/javadoc/user/org/objectweb/asm/Type.html#getMethodDescriptor%28java.lang.reflect.Method%29 fournit exactement le résultat que vous attendez.

Note offtopique par souci d'exhaustivité: Dans mon cas d'utilisation j'avais aussi besoin de conversions. Cela peut être réalisé par les méthodes Type.getArgumentTypes (sig) et Type.getReturnType (sig). Les éléments de tableau résultants de type Type fournissent la méthode getClassName() à partir de laquelle vous obtenez une classe de référence via Class.forName ou une classe primitive via une instruction simple if ou une carte.

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

Tous les paramètres ou types de retours ne sont pas des tableaux ... mais certains le sont. – EJP

+0

Oui ... ignorez simplement la signature du tableau '[' devant la chaîne ... –

+0

bonne idée! Je me demande pourquoi OP n'a pas accepté cela comme réponse. – user3911119