11

所需的输出示例:

(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

4 回答 4

4

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

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

于 2012-03-04T00:37:45.033 回答
2
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;
    }
于 2016-10-24T03:53:57.113 回答
0

我曾经试图创建这个关于生成方法签名的长篇文章,我记得是按照以下风格来做的,但我不确定它是否安静了很长时间

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

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

于 2010-12-16T03:15:02.580 回答
0

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

于 2010-12-16T05:14:52.073 回答