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