2010-12-16 3 views
10

gewünschte Ausgangs Beispiele:Wie man Methodensignatur erzeugt?

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

Solche Signaturen javap Dienstprogramm erzeugt, lassen sich mit:

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

Aber gibt es eine Möglichkeit, sie programmatisch zu generieren. Ich möchte nicht alle Regeln von jni manuell codieren.

+0

um, ist es das? –

+0

Was? birryree

+0

@bemace, @birryre. Es tut uns leid, nicht klar zu sein, fügte weitere Details hinzu. – alex2k8

Antwort

1

ich einmal versuchte, dies zu schaffen, lange zurück über die die Methodensignatur zu erzeugen, ich diese Art von folgenden erinnere mich an, aber ich bin nicht sicher, es ist eine ruhige lange Zeit

1) ich meine eigene Klasse geschrieben haben um die Methodensignatur zu generieren 2) Ich habe die Reflection-Klasse verwendet, um die Methode Names dynamisch zu erhalten.

Ich hoffe, dies kann Ihnen helfen, eine Vorstellung zu bekommen, wenn nicht die vollständige Lösung für Ihr Problem

+0

Schwer zu sehen, wie dies als eine Antwort qualifiziert. – EJP

0

Benutzer ASM Library of Objectweb. Es ist nicht nur schnell, aber Sie haben die Wahl über die Klasse

4

http://asm.ow2.org/asm31/javadoc/user/org/objectweb/asm/Type.html#getMethodDescriptor%28java.lang.reflect.Method%29 bietet genau das Ergebnis, was Sie erwarten.

Offtopic Note aus Gründen der Vollständigkeit: In meinem Anwendungsfall brauchte ich auch die Konvertierung umgekehrt. Dies kann durch die Methoden Type.getArgumentTypes (sig) und Type.getReturnType (sig) erreicht werden. Resultierende Array-Elemente vom Typ Type stellen die Methode getClassName() bereit, von der Sie eine Referenzklasse über Class.forName oder eine primitive Klasse über eine einfache if-Anweisung oder -Karte erhalten.

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

Nicht jeder Parameter oder Rückgabetyp ist ein Array ... aber einige sind. – EJP

+0

Ja ... ignorieren Sie einfach Array-Signatur '[' vor String ... –

+0

tolle Idee! frage mich, warum OP dies nicht als Antwort akzeptiert hat. – user3911119