一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

java語(yǔ)言

Java Class文件是什么

時(shí)間:2025-03-25 15:28:54 java語(yǔ)言 我要投稿

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

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看