當前位置:才華齋>計算機>java語言>

Java Class檔案是什麼

java語言 閱讀(3.08W)

Class 類是在Java語言中定義一個特定類的實現。一個類的定義包含成員變數,成員方法,還有這個類實現的介面,以及這個類的父類。Class類的物件用於表示當前執行的 Java 應用程式中的類和介面。 比如:每個陣列均屬於一個 Class 類物件,所有具有相同元素型別和維數的陣列共享一個Class 物件。基本的 Java 型別(boolean, byte, char, short, int, long, float 和 double) 和 void 型別也可表示為 Class 物件。下面是小編為大家帶來的關於Java Class檔案是什麼的知識,歡迎閱讀。

Java Class檔案是什麼

  一,class類有什麼用?

class類的例項表示java應用執行時的類(class ans enum)或介面(interface and annotation)(每個java類執行時都在JVM裡表現為一個class物件,可通過類名s,型別lass(),ame("類名")等方法獲取class物件)。陣列同樣也被對映為為class 物件的一個類,所有具有相同元素型別和維數的陣列都共享該 Class 物件。基本型別boolean,byte,char,short,int,long,float,double和關鍵字void同樣表現為 class 物件。

  二,class類的特徵

class類沒有公有的構造方法,它由JVM自動呼叫(在new物件或者載入-classLoader時)。

下面的方法作用是打印出物件的class name:

void printClassName(Object obj) {

tln("The class of " + obj +

" is " + lass()ame());

}

同樣可以根據class literal 獲得class name:

tln("The name of class Foo is: "+ame());//你可以將Foo改為void嘗試下。

  三,class的主要方法

class類的方法還是挺多的。主要是用於得到執行時類的相關資訊(可用於反射)。

重要的幾個方法:

  1, public static Class forName(String className) :natice 方法,動態載入類。非常重要。

如在sql中動態載入驅動程式:ame(sqlDriver);

  2,public T newInstance() :根據物件的class新建一個物件,用於反射。非常重要。

可用在反射中構建物件,呼叫物件方法:

class doubleClass= ame("le");

Object objDouble = nstance();

如在javaBean中就應用了這個方法,因為java預設要有一個無參建構函式。

  3, public ClassLoader getClassLoader() :獲得類的類載入器Bootstrap ,Extension ,System or user custom ClassLoader(一般為system classloader)。重要。

  4,public String getName() :獲取類或介面的名字。記住enum為類,annotation為介面。重要

  5,public native Class getSuperclass():獲取類的父類,繼承了父類則返回父類,否則返回ct。返回Object的父類為空-null。一般

  6,public getResource(String name) :根據字串獲得資源。

  7,其他類

public boolean isEnum() :判斷是否為列舉型別。

public native boolean isArray() :判斷是否為陣列型別。

public native boolean isPrimitive() :判斷是否為基本型別。

public boolean isAnnotation() :判斷是否為註解型別。

public Package getPackage() :反射中獲得package,如ct 的package為。

public native int getModifiers() : 反射中獲得修飾符,如public static void等 。

public Field getField(String name):反射中獲得域成員。

public Field[] getFields() :獲得域陣列成員。

public Method[] getMethods() :獲得方法。

public Method getDeclaredMethod(String name, Class... parameterTypes):加個Declared代表本類,繼承,父類均不包括。

public Constructor[] getConstructors() :獲得所有的建構函式。

如此我們可以知道反射可以執行時動態獲得類的所有資訊,並新建物件(newInstance()方法)。

Class檔案中包含以下資訊:

[+]view code

  1. 通過例項來看

[+]view code

  2. 魔數

作用:確定該檔案是否是虛擬機器可接受的class檔案。java的魔數統一為 0xCAFEBABE (來源於一款咖啡)。

區域:檔案第0~3位元組。

  3. 版本號

作用:表示class檔案的版本,由minorversion和majorversion組成。

區域:檔案第4~7位元組。

Java Class檔案是什麼? 三聯

51代表,jdk為1.7.0

需要注意的是java版本號是從45開始的,大版本釋出,主版本號+1.高版本的jdk能向下相容以前版本的class檔案,但不相容以後版本的class檔案。

  4. 常量池

常量池的大小是不固定的,根據你的類中的常量的多少而定,所以在常量池的入口,放置了一個u2型別的表示常量池中常量個數的常量池容量計數器。計數器從1開始,第0位有特殊含義,表示指向常量池的索引值資料不引用 任何一個常量池專案。池中的資料項就像陣列一樣是通過索引訪問的。

我們可以清楚的看到,我們常量池中有63-1=62個常量。這些常量是什麼呢?

要存放字面量Literal和符號引用Symbolic References。

字面量可能是文字字串,或final的常量值。

符號引用包括以下:

類或介面全限定名 Full Qualified Name

欄位名稱和描述符 Descriptor

方法名稱和描述符

我們使用反編譯工具檢視一下:

[+]view code

常量池中的專案型別如下:

CONSTANT_Utf8_info tag標誌位為1, UTF-8編碼的字串

CONSTANT_Integer_info tag標誌位為3, 整形字面量

CONSTANT_Float_info tag標誌位為4, 浮點型字面量

CONSTANT_Long_info tag標誌位為5, 長整形字面量

CONSTANT_Double_info tag標誌位為6, 雙精度字面量

CONSTANT_Class_info tag標誌位為7, 類或介面的符號引用

CONSTANT_String_info tag標誌位為8,字串型別的字面量

CONSTANT_Fieldref_info tag標誌位為9, 欄位的符號引用

CONSTANT_Methodref_info tag標誌位為10,類中方法的符號引用

CONSTANT_InterfaceMethodref_info tag標誌位為11, 介面中方法的符號引用

CONSTANT_NameAndType_info tag 標誌位為12,欄位和方法的名稱以及型別的符號引用

  5. 類或介面訪問標誌

表示類或者介面方面的訪問資訊,比如Class表示的是類還是介面,是否為public、static、final等。,下面我們就來看看TestClass的訪問標示。Class的'訪問標誌值為0x0021:

根據前面說的各種訪問標示的標誌位,我們可以知道:0x0021=0x0001|0x0020 也即ACC_PUBLIC 和 ACC_SUPER為真,其中ACC_PUBLIC大家好理解,ACC_SUPER是jdk1.2之後編譯的類都會帶有的標誌。

  6. 類索引、父類索引與介面索引集合

Class檔案中由這3項資料來確定類的繼承關係。

類索引和父類索引都是指向常量池中的常量索引:

  7. 欄位表集合

作用:描述介面或者類中宣告的類變數以及例項變數,不包括方法中的區域性變數。

緊接著介面索引集合之後的2位元組是欄位計數器:

V 表示特殊型別void。

對於陣列型別,每一個維度將使用一個前置的”["字元來描述,如一個定義的"ng[][]“型別的二維陣列,將被記錄為:”[[Ljava/lang/String;",一個整型陣列"int[]“將被記錄為”[I"

父類中的欄位不會出現在子類的欄位表中。

  8. 方法表集合

欄位表集合結束後便是方法表集合。

作用:描述該類中的方法。

和欄位表一樣,使用一個u2型別的方法計數器,記錄該類中方法的個數。