- Java語(yǔ)言Class文件是什么 推薦度:
- 相關(guān)推薦
Java Class文件是什么
Class 類(lèi)是在Java語(yǔ)言中定義一個(gè)特定類(lèi)的實(shí)現。一個(gè)類(lèi)的定義包含成員變量,成員方法,還有這個(gè)類(lèi)實(shí)現的接口,以及這個(gè)類(lèi)的父類(lèi)。Class類(lèi)的對象用于表示當前運行的 Java 應用程序中的類(lèi)和接口。 比如:每個(gè)數組均屬于一個(gè) Class 類(lèi)對象,所有具有相同元素類(lèi)型和維數的數組共享一個(gè)Class 對象;镜 Java 類(lèi)型(boolean, byte, char, short, int, long, float 和 double) 和 void 類(lèi)型也可表示為 Class 對象。下面是小編為大家帶來(lái)的關(guān)于Java Class文件是什么的知識,歡迎閱讀。
一,class類(lèi)有什么用?
class類(lèi)的實(shí)例表示java應用運行時(shí)的類(lèi)(class ans enum)或接口(interface and annotation)(每個(gè)java類(lèi)運行時(shí)都在JVM里表現為一個(gè)class對象,可通過(guò)類(lèi)名.class,類(lèi)型.getClass(),Class.forName("類(lèi)名")等方法獲取class對象)。數組同樣也被映射為為class 對象的一個(gè)類(lèi),所有具有相同元素類(lèi)型和維數的數組都共享該 Class 對象;绢(lèi)型boolean,byte,char,short,int,long,float,double和關(guān)鍵字void同樣表現為 class 對象。
二,class類(lèi)的特征
class類(lèi)沒(méi)有公有的構造方法,它由JVM自動(dòng)調用(在new對象或者加載-classLoader時(shí))。
下面的方法作用是打印出對象的class name:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
同樣可以根據class literal 獲得class name:
System.out.println("The name of class Foo is: "+Foo.class.getName());//你可以將Foo改為void嘗試下。
三,class的主要方法
class類(lèi)的方法還是挺多的。主要是用于得到運行時(shí)類(lèi)的相關(guān)信息(可用于反射)。
重要的幾個(gè)方法:
1, public static Class forName(String className) :natice 方法,動(dòng)態(tài)加載類(lèi)。非常重要。
如在sql中動(dòng)態(tài)加載驅動(dòng)程序:class.forName(sqlDriver);
2,public T newInstance() :根據對象的class新建一個(gè)對象,用于反射。非常重要。
可用在反射中構建對象,調用對象方法:
class doubleClass= class.forName("java.lang.Double");
Object objDouble = doubleClass.newInstance();
如在javaBean中就應用了這個(gè)方法,因為java默認要有一個(gè)無(wú)參構造函數。
3, public ClassLoader getClassLoader() :獲得類(lèi)的類(lèi)加載器Bootstrap ,Extension ,System or user custom ClassLoader(一般為system classloader)。重要。
4,public String getName() :獲取類(lèi)或接口的名字。記住enum為類(lèi),annotation為接口。重要
5,public native Class getSuperclass():獲取類(lèi)的父類(lèi),繼承了父類(lèi)則返回父類(lèi),否則返回java.lang.Object。返回Object的父類(lèi)為空-null。一般
6,public java.net.URL getResource(String name) :根據字符串獲得資源。
7,其他類(lèi)
public boolean isEnum() :判斷是否為枚舉類(lèi)型。
public native boolean isArray() :判斷是否為數組類(lèi)型。
public native boolean isPrimitive() :判斷是否為基本類(lèi)型。
public boolean isAnnotation() :判斷是否為注解類(lèi)型。
public Package getPackage() :反射中獲得package,如java.lang.Object 的package為java.lang。
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):加個(gè)Declared代表本類(lèi),繼承,父類(lèi)均不包括。
public Constructor[] getConstructors() :獲得所有的構造函數。
如此我們可以知道反射可以運行時(shí)動(dòng)態(tài)獲得類(lèi)的所有信息,并新建對象(newInstance()方法)。
Class文件中包含以下信息:
[+]view code
1. 通過(guò)實(shí)例來(lái)看
[+]view code
2. 魔數
作用:確定該文件是否是虛擬機可接受的class文件。java的魔數統一為 0xCAFEBABE (來(lái)源于一款咖啡)。
區域:文件第0~3字節。
3. 版本號
作用:表示class文件的版本,由minorversion和majorversion組成。
區域:文件第4~7字節。
Java Class文件是什么? 三聯(lián)
51代表,jdk為1.7.0
需要注意的是java版本號是從45開(kāi)始的,大版本發(fā)布,主版本號+1.高版本的jdk能向下兼容以前版本的class文件,但不兼容以后版本的class文件。
4. 常量池
常量池的大小是不固定的,根據你的類(lèi)中的常量的多少而定,所以在常量池的入口,放置了一個(gè)u2類(lèi)型的表示常量池中常量個(gè)數的常量池容量計數器。計數器從1開(kāi)始,第0位有特殊含義,表示指向常量池的索引值數據不引用 任何一個(gè)常量池項目。池中的數據項就像數組一樣是通過(guò)索引訪(fǎng)問(wèn)的。
我們可以清楚的看到,我們常量池中有63-1=62個(gè)常量。這些常量是什么呢?
要存放字面量Literal和符號引用Symbolic References。
字面量可能是文本字符串,或final的常量值。
符號引用包括以下:
類(lèi)或接口全限定名 Full Qualified Name
字段名稱(chēng)和描述符 Descriptor
方法名稱(chēng)和描述符
我們使用反編譯工具查看一下:
[+]view code
常量池中的項目類(lèi)型如下:
CONSTANT_Utf8_info tag標志位為1, UTF-8編碼的字符串
CONSTANT_Integer_info tag標志位為3, 整形字面量
CONSTANT_Float_info tag標志位為4, 浮點(diǎn)型字面量
CONSTANT_Long_info tag標志位為5, 長(cháng)整形字面量
CONSTANT_Double_info tag標志位為6, 雙精度字面量
CONSTANT_Class_info tag標志位為7, 類(lèi)或接口的符號引用
CONSTANT_String_info tag標志位為8,字符串類(lèi)型的字面量
CONSTANT_Fieldref_info tag標志位為9, 字段的符號引用
CONSTANT_Methodref_info tag標志位為10,類(lèi)中方法的符號引用
CONSTANT_InterfaceMethodref_info tag標志位為11, 接口中方法的符號引用
CONSTANT_NameAndType_info tag 標志位為12,字段和方法的名稱(chēng)以及類(lèi)型的符號引用
5. 類(lèi)或接口訪(fǎng)問(wèn)標志
表示類(lèi)或者接口方面的訪(fǎng)問(wèn)信息,比如Class表示的是類(lèi)還是接口,是否為public、static、final等。,下面我們就來(lái)看看TestClass的訪(fǎng)問(wèn)標示。Class的訪(fǎng)問(wèn)標志值為0x0021:
根據前面說(shuō)的各種訪(fǎng)問(wèn)標示的標志位,我們可以知道:0x0021=0x0001|0x0020 也即ACC_PUBLIC 和 ACC_SUPER為真,其中ACC_PUBLIC大家好理解,ACC_SUPER是jdk1.2之后編譯的類(lèi)都會(huì )帶有的標志。
6. 類(lèi)索引、父類(lèi)索引與接口索引集合
Class文件中由這3項數據來(lái)確定類(lèi)的繼承關(guān)系。
類(lèi)索引和父類(lèi)索引都是指向常量池中的常量索引:
7. 字段表集合
作用:描述接口或者類(lèi)中聲明的類(lèi)變量以及實(shí)例變量,不包括方法中的局部變量。
緊接著(zhù)接口索引集合之后的2字節是字段計數器:
V 表示特殊類(lèi)型void。
對于數組類(lèi)型,每一個(gè)維度將使用一個(gè)前置的”["字符來(lái)描述,如一個(gè)定義的"java.lang.String[][]“類(lèi)型的二維數組,將被記錄為:”[[Ljava/lang/String;",一個(gè)整型數組"int[]“將被記錄為”[I"
父類(lèi)中的字段不會(huì )出現在子類(lèi)的字段表中。
8. 方法表集合
字段表集合結束后便是方法表集合。
作用:描述該類(lèi)中的方法。
和字段表一樣,使用一個(gè)u2類(lèi)型的方法計數器,記錄該類(lèi)中方法的個(gè)數。
【Java Class文件是什么】相關(guān)文章:
Java語(yǔ)言Class文件是什么09-02
java類(lèi)文件是什么10-31
java - public class與class的區別詳解09-29
java獲取Class對象的方法08-12
java的Class類(lèi)有哪些10-01
Java中Class對象詳解09-03
java讀文件寫(xiě)文件的方法06-24
Java寫(xiě)入文件的方法05-24
java類(lèi)文件內容介紹08-07