2010-12-16 11 views
10

mong muốn ví dụ đầu ra:Cách tạo chữ ký phương thức?

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

chữ ký như vậy có thể được tạo ra bằng cách sử dụng tiện ích javap:

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

Nhưng có cách nào để tạo ra chúng lập trình. Tôi không muốn mã thủ công tất cả các quy tắc từ thông số jni.

+0

um, phải không? –

+0

Cái gì? birryree

+0

@bemace, @birryre. Xin lỗi để không rõ ràng, thêm chi tiết. – alex2k8

Trả lời

1

Tôi đã từng cố gắng tạo này dài trở lại về tạo chữ ký phương pháp, tôi nhớ làm điều này bằng cách làm theo phong cách, nhưng tôi không chắc chắn của nó một thời gian dài im lặng

1) Tôi đã viết lớp của riêng tôi để tạo chữ ký phương thức 2) Tôi đã sử dụng lớp phản chiếu để có được phương thức Tên động.

Tôi hy vọng điều này có thể giúp bạn có ý tưởng, nếu không phải là giải pháp đầy đủ cho vấn đề của bạn

+0

Khó để xem cách thức này đủ điều kiện làm câu trả lời. – EJP

0

User ASM Library of Objectweb. Nó không chỉ nhanh mà bạn có thể có sự lựa chọn về việc đi ngang qua lớp

4

http://asm.ow2.org/asm31/javadoc/user/org/objectweb/asm/Type.html#getMethodDescriptor%28java.lang.reflect.Method%29 cung cấp kết quả chính xác những gì bạn mong đợi.

Lưu ý ngoại trừ vì mục đích hoàn chỉnh: Trong trường hợp sử dụng của tôi, tôi cũng cần chuyển đổi ngược lại. Điều này có thể đạt được bằng các phương thức Type.getArgumentTypes (sig) và Type.getReturnType (sig). Các phần tử mảng kết quả của kiểu Type cung cấp phương thức getClassName() từ đó bạn có được lớp tham chiếu thông qua Class.forName hoặc lớp nguyên thủy thông qua câu lệnh if hoặc map đơn giản.

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

Không phải mọi tham số hoặc kiểu trả về đều là mảng ... nhưng một số là. – EJP

+0

Có ... chỉ cần bỏ qua chữ ký mảng '[' trước chuỗi ... –

+0

ý tưởng tuyệt vời! tự hỏi tại sao OP không chấp nhận điều này như là câu trả lời. – user3911119