av手机免费在线观看,国产女人在线视频,国产xxxx免费,捆绑调教一二三区,97影院最新理论片,色之久久综合,国产精品日韩欧美一区二区三区

java語(yǔ)言

Java Class文件是什么

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

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對(duì)象的方法08-12

java的Class類(lèi)有哪些10-01

Java中Class對(duì)象詳解09-03

java讀文件寫(xiě)文件的方法06-24

Java寫(xiě)入文件的方法05-24

java類(lèi)文件內(nèi)容介紹08-07