【问题标题】:Compute a Java function's signature计算 Java 函数的签名
【发布时间】:2011-12-25 08:38:18
【问题描述】:

有没有办法计算 Java 类的方法签名?签名
([Ljava/lang/String;)V 表示一个以String[] 作为参数的函数
并返回void

计算签名的规则是什么?

【问题讨论】:

    标签: java method-signature


    【解决方案1】:

    它始终是一组括号,其中包含参数的类型指示符,一个接一个,没有逗号或任何东西,在结束括号之后是返回值的类型指示符。这很简单。

    this page: 上有一个类型签名表

    Signature    Java Type
    Z    boolean
    B    byte
    C    char
    S    short
    I    int
    J    long
    F    float
    D    double
    V    void
    L fully-qualified-class ;    fully-qualified-class
    [ type   type[]
    

    最后两个意味着命名一个类,例如Ljava/lang/Object;,命名一个数组(例如)int,你说[I,一个数组@ 987654326@ 是[[I

    如果您想在 Java 代码中基于反射逐字计算签名,这很简单;只需将上表与处理对象和数组的规则一起使用即可。

    【讨论】:

      【解决方案2】:

      只需在包含.class 文件的文件夹中运行javap -s <class-name>。它会以 100% 的准确率告诉你。不用猜这些。

      【讨论】:

        【解决方案3】:

        快速谷歌搜索发现了这个网页:

        http://www.rgagnon.com/javadetails/java-0286.html

        签名有两个部分。第一部分用括号括起来,表示方法的参数。第二部分跟在右括号之后,代表返回类型。 Java类型和C类型的映射关系是

        Type     Chararacter 
        boolean      Z 
        byte         B 
        char         C 
        double       D 
        float        F 
        int          I 
        long         J 
        object       L 
        short        S 
        void         V 
        array        [ 
        

        【讨论】:

          【解决方案4】:

          有关详细信息,请参阅here

          基本上是参数,然后是返回值。

          【讨论】:

            【解决方案5】:

            来自the JLS, §8.4.2

            8.4.2 方法签名

            方法的签名由方法的名称和 方法的形式参数的数量和类型。一个类可能不 声明具有相同签名的两个方法,或编译时错误 发生。

            例子:

            class Point implements Move {
              int x, y;
              abstract void move(int dx, int dy);
              void move(int dx, int dy) { x += dx; y += dy; }
            }
            

            导致编译时错误,因为它声明了两个 move 方法 具有相同的签名。这是一个错误,即使其中之一 声明是abstract

            所以“规则”是

            方法的名称和方法的形参的数量和类型

            【讨论】:

            • 我是不是误解了这个问题?
            • 认为 OP 是在谈论速记版本中使用的实际字符,尽管没有明确说明,这使得投票有点苛刻。跨度>
            • 这有点讽刺,IMO,OP 询问签名,但提供的“速记”示例不包括方法名称。
            • 是的,我认为签名和描述符之间存在一些混淆,但是,嘿。
            【解决方案6】:

            您可以在Java Virtual Machine Specification找到此信息

            【讨论】:

              猜你喜欢
              • 2012-11-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-05-08
              • 2016-06-18
              • 1970-01-01
              • 2012-08-02
              • 1970-01-01
              相关资源
              最近更新 更多