方法簽名的意義
- 對於同名不同類、同類不同名的方法,方法簽名的意義並不是很大,但是對於重載方法來說,方法簽名的意義就十分巨大了。由於重載方法之間的方法名是相同的,那麼我們勢必要從構成方法的其他幾個要素中找到另一個要素與方法名組成能夠唯一標示方法的簽名,方法體當然不予考慮。那麼就是形參列表和返回值了,但是由於對於調用方法的人來說,方法的形參數據類型列表的重要程度要遠遠高於返回值,所以方法簽名就由方法名+形參列表構成,也就是說,方法名和形參數據類型列表可以唯一的確定一個方法,與方法的返回值一點關係都沒有,這是判斷重載重要依據,所以,以下的代碼是不允許的
public long aaaa(){
}
public int aaaa(){
}
方法簽名的格式
- 首先我們先看幾個方法以及他們的方法簽名:
public void test1(){} test1()V
public void test2(String str) test2(Ljava/lang/String;)V
public int test3(){} test3()I
從以上三個例子,我們就可以很簡單的看出一些小小的規律:
JVM爲我們提供的方法簽名實際上是由方法名(上文的例子爲了簡單沒有寫出全類名)、形參列表、返回值三部分構成的,基本形式就是:
全類名.方法名(形參數據類型列表)返回值數據類型Java方法簽名中特殊字符/字母含義
特殊字符 | 數據類型 | 特殊說明 |
---|---|---|
V | void | 一般用於表示方法的返回值 |
Z | boolean | |
B | byte | |
C | char | |
S | short | |
I | int | |
J | long | |
F | float | |
D | double | |
[ | 數組 | 以[開頭,配合其他的特殊字符,表示對應數據類型的數組,幾個[表示幾維數組 |
L | 全類名; | 引用類型 以 L 開頭 ; 結尾,中間是引用類型的全類名 |
一定要注意的是方法重載時,方法返回值沒有什麼意義,是由方法名和參數列表決定的
利用javap生成方法簽名
類庫類
$ javap -s java.lang.String
Compiled from "String.java"
public final class java.lang.String extends java.lang.Object implements java.io.Serializable,java.lang.Comparable,java.lang.CharSequence{
public static final java.util.Comparator CASE_INSENSITIVE_ORDER;
Signature: Ljava/util/Comparator;
public java.lang.String();
Signature: ()V
public java.lang.String(java.lang.String);
Signature: (Ljava/lang/String;)V
public java.lang.String(char[]);
Signature: ([C)V
public java.lang.String(char[], int, int);
Signature: ([CII)V
public java.lang.String(int[], int, int);
Signature: ([III)V
public java.lang.String(byte[], int, int, int);
Signature: ([BIII)V
public java.lang.String(byte[], int);
Signature: ([BI)V
public java.lang.String(byte[], int, int, java.lang.String) throws java.io.UnsupportedEncodingException;
Signature: ([BIILjava/lang/String;)V
public java.lang.String(byte[], int, int, java.nio.charset.Charset);
Signature: ([BIILjava/nio/charset/Charset;)V
public java.lang.String(byte[], java.lang.String) throws java.io.UnsupportedEncodingException;
Signature: ([BLjava/lang/String;)V
public java.lang.String(byte[], java.nio.charset.Charset);
Signature: ([BLjava/nio/charset/Charset;)V
public java.lang.String(byte[], int, int);
Signature: ([BII)V
...
自定義類
package com.demo;
public class SigTest {
public static final String name = null;
public int getName(int[] data,long index) {
return 0;
}
}
- 輸出
$ javac SigTest.java
$ javap -s -p com.demo.SigTest
Compiled from "SigTest.java"
public class com.demo.SigTest extends java.lang.Object{
public static final java.lang.String name;
Signature: Ljava/lang/String;
public com.demo.SigTest();
Signature: ()V
public int getName(int[], long);
Signature: ([IJ)I
static {};
Signature: ()V
}
-s 表示打印簽名信息
-p 表示打印所有函數和成員的簽名信息,默認只打印public的簽名信息