【问题标题】:How to generate method signature?如何生成方法签名?
【发布时间】:2011-05-26 07:21:41
【问题描述】:

所需的输出示例:

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

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

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

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

【问题讨论】:

  • @bemace,@birryre。抱歉不清楚,添加了更多细节。
  • 为什么?您知道您将在完成时调用哪些方法。否则你不能编译你的代码。您不需要在运行时生成此信息。还是您在寻找反射 API?

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


【解决方案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;
    }

【讨论】:

  • 不是每个参数或返回类型都是一个数组......但有些是。
  • 好主意!想知道为什么 OP 不接受这个作为答案。
【解决方案2】:

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 语句或映射获取原始类。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 很难看出这有什么资格作为答案。
      猜你喜欢
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2012-07-26
      相关资源
      最近更新 更多