如何生成方法签名?

问题描述 投票:0回答:5

所需的输出示例:

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

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

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

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

java reflection java-native-interface method-signature
5个回答
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 语句或 map 获取原始类。


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

0
投票

我曾经尝试创建这个关于生成方法签名的长篇文章,我记得是通过遵循风格来做到这一点的,但我不确定这是一个安静的很长一段时间

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

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


0
投票

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


0
投票

在 Android Studio 中,IDE 本身会自动创建这些签名。 只需声明您的函数并按

Alt+Ctl
,然后为 functionName 选择创建 JNI 函数即可。

© www.soinside.com 2019 - 2024. All rights reserved.