2010-12-16 4 views
10

원하는 출력 예 :메서드 서명을 생성하는 방법은 무엇입니까?

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

이러한 서명은 javap 유틸리티를 사용하여 생성 할 수 있습니다

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

그러나 프로그램을 생성 할 수있는 방법이있다. 나는 수동으로 jni 명세에서 모든 규칙을 코딩하고 싶지 않다.

+0

음입니까? –

+0

무엇? birryree

+0

@bemace, @birryre. 명확하지 않아서 죄송합니다. 자세한 내용을 추가했습니다. – alex2k8

답변

1

한번 긴 다시는 방법 서명, 나는 스타일에 따라이 일을 기억을 생성하는 방법에 대한이를 만들려고했지만, 나는 그것의 난 내 자신의 클래스를 작성했습니다

1) 조용한 시간이 확실하지 않다 메서드 서명을 생성하려면 2) 리플렉션 클래스를 사용하여 메서드 이름을 동적으로 가져 왔습니다.

나는, 이것이 당신이 아이디어를 얻을하는 데 도움이 될 수 있습니다 희망하지 않을 경우 문제 오브젝트 웹의

+0

이것이 어떻게 답의 자격을 얻는 지보기가 어렵습니다. – EJP

0

사용자 ASM 라이브러리의 전체 솔루션입니다. 그뿐만 아니라 빠르지 만 클래스를 통과하는 것에 대해 선택할 수 있습니다.

4

http://asm.ow2.org/asm31/javadoc/user/org/objectweb/asm/Type.html#getMethodDescriptor%28java.lang.reflect.Method%29 정확히 예상 한 결과를 제공합니다.

완성도를위한 Offtopic 참고 : 내 경우에는 변환도 필요했습니다. 이것은, Type.getArgumentTypes (sig) 및 Type.getReturnType (sig) 메소드에 의해 실현할 수 있습니다. 생성되는 형태의 배열 요소는, Class.forName를 개입시켜 참조 클래스를 취득하는 getClassName() 메소드 또는 단순한 if 문 또는 MAP를 사용해 프리미티브 (primitive) 클래스를 제공합니다.

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

모든 매개 변수 또는 반환 유형이 배열은 아니지만 일부는 있습니다. – EJP

+0

예 ... 문자열 앞에 '['배열의 시그니처를 무시하십시오 ... –

+0

좋은 아이디어! 왜 OP가 이것을 대답으로 받아들이지 않았는 지 궁금해합니다. – user3911119

관련 문제