如何生成方法签名?

时间:2010-12-16 02:11:59

标签: java reflection java-native-interface method-signature

所需的输出示例:

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

可以使用javap实用程序生成此类签名:

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

但有没有办法以编程方式生成它们。我不想手动编写jni规范中的所有规则。

4 个答案:

答案 0 :(得分:4)

http://asm.ow2.org/asm31/javadoc/user/org/objectweb/asm/Type.html#getMethodDescriptor%28java.lang.reflect.Method%29提供了您期望的结果。

为了完整起见,Offtopic note: 在我的用例中,我还需要转换,反之亦然。这可以通过方法Type.getArgumentTypes(sig)和Type.getReturnType(sig)来实现。结果类型为Type的数组元素提供方法getClassName(),您可以通过简单的if语句或map从中通过Class.forName或原始类获取引用类。

答案 1 :(得分:1)

我曾经试图创建这个关于生成方法签名的长篇大论,我记得通过跟随样式来做这件事,但我不确定它是一个安静的长时间

1)我编写了自己的类来生成方法签名 2)我使用了反射类来动态获取Names方法。

我希望这可以帮助您获得一个想法,如果不是您的问题的完整解决方案

答案 2 :(得分:1)

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;
    }

答案 3 :(得分:0)

Objectweb的用户ASM库。它不仅速度快,而且可以选择遍历课程