java 方法簽名,我想做java 開發(fā)的朋友也知道,方法簽名的重要性,是方法重載的一個比較好的解釋,尤其是在后續(xù)優(yōu)化方面,這里記錄下,有看到的朋友也可看下,
方法簽名的意義
對于同名不同類、同類不同名的方法,方法簽名的意義并不是很大,但是對于重載方法來說,方法簽名的意義就十分巨大了。由于重載方法之間的方法名是相同的,那么我們勢必要從構成方法的其他幾個要素中找到另一個要素與方法名組成能夠唯一標示方法的簽名,方法體當然不予考慮。那么就是形參列表和返回值了,但是由于對于調用方法的人來說,方法的形參數(shù)據類型列表的重要程度要遠遠高于返回值,所以方法簽名就由方法名+形參列表構成,也就是說,方法名和形參數(shù)據類型列表可以唯一的確定一個方法,與方法的返回值一點關系都沒有,這是判斷重載重要依據,所以,以下的代碼是不允許的
1
2
3
4
5
6
|
public long aaaa(){ } public int aaaa(){ } |
方法簽名的格式
首先我們先看幾個方法以及他們的方法簽名:
1
2
3
|
public void test1(){} test1()V public void test2(String str) test2(Ljava/lang/String;)V public int test3(){} test3()I |
從以上三個例子,我們就可以很簡單的看出一些小小的規(guī)律:
JVM為我們提供的方法簽名實際上是由方法名(上文的例子為了簡單沒有寫出全類名)、形參列表、返回值三部分構成的,基本形式就是:
全類名.方法名(形參數(shù)據類型列表)返回值數(shù)據類型
Java方法簽名中特殊字符/字母含義
特殊字符 | 數(shù)據類型 | 特殊說明 |
---|---|---|
V | void | 一般用于表示方法的返回值 |
Z | boolean | |
B | byte | |
C | char | |
S | short | |
I | int | |
J | long | |
F | float | |
D | double | |
[ | 數(shù)組 | 以[開頭,配合其他的特殊字符,表示對應數(shù)據類型的數(shù)組,幾個[表示幾維數(shù)組 |
L | 全類名; | 引用類型 以 L 開頭 ; 結尾,中間是引用類型的全類名 |
一定要注意的是方法重載時,方法返回值沒有什么意義,是由方法名和參數(shù)列表決定的
利用javap生成方法簽名
類庫類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
$ 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 ... |
自定義類
1
2
3
4
5
6
7
|
package com.demo; public class SigTest { public static final String name = null ; public int getName( int [] data, long index) { return 0 ; } } |
輸出
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$ 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 表示打印所有函數(shù)和成員的簽名信息,默認只打印public的簽名信息
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/qiuchengjia/article/details/52910884