歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java中Class與Object及反射機制

平時看代碼時,總是碰到這些即熟悉又陌生的名次,每天都與他們相見,但見面後又似曾沒有任何的交集,所以今天我就來認識下這兩個江湖俠客的背景:

CLASS

在Java中,每個class都有一個相應的Class對象。也就是說,當我們編寫一個類,編譯完成後,在生成的.class文件中,就會產生一個Class對象,用於表示這個類的類型信息

獲取Class實例的三種方式:

(1)利用對象調用getClass()方法獲取該對象的Class實例;

(2)使用Class類的靜態方法forName(),用類的名字獲取一個Class實例(staticClass forName(String className) Returns the Classobject associated with the class or interface with the given stringname. );

(3)運用.class的方式來獲取Class實例,對於基本數據類型的封裝類,還可以采用.TYPE來獲取相對應的基本數據類型的Class實例

在newInstance()調用類中缺省的構造方法 ObjectnewInstance()(可在不知該類的名字的時候,常見這個類的實例) Creates a new instance of the class represented by this Classobject.

在運行期間,如果我們要產生某個類的對象,Java虛擬機(JVM)會檢查該類型的Class對象是否已被加載。如果沒有被加載,JVM會根據類的名稱找到.class文件並加載它。一旦某個類型的Class對象已被加載到內存,就可以用它來產生該類型的所有對象

Class對象的生成方式如下:

1.Class.forName("類名字符串") (注意:類名字符串必須是全稱,包名+類名);

2.類名.class;

3.實例對象.getClass();

package baseJava;

public class TestClass {

 /**
  * @param args
  * 2013-4-11 上午10:30:05
  * @author zhao_xingcai
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  try {
 
   //測試Class.forName() 
   Class classForName = Class.forName("baseJava.TestClass");
   System.out.println("classForName  : [" + classForName + "]");
   
   //測試類名.class
   Class classForName2 = TestClass.class;
   System.out.println("classForName2 : [" + classForName2 + "]");
   
   //測試Object.getClass()
   TestClass newInstance = new TestClass();
   System.out.println("newInstance  : [" + newInstance.getClass() + "]");
   
   //hashCode指的是內存的地址
   System.out.println("newInstanceHashCode  : [" + newInstance.hashCode() + "]");
   
   //toString代表該對象的一個字符串
   //格式:this.getClass().getName() + '@' + Integer.toHexString(hashCode())
   System.out.println("newInstanceToString  : [" + newInstance.toString() + "]");
   
   
  }catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }
 /*
  * 構造函數
  */
 public TestClass() {
  System.out.println(" 構造函數");
 }
 
 /*
  * 靜態的參數初始化 
  */
 static {
  System.out.println("靜態的參數初始化  ");
 }
 
 /*
  * 非靜態的參數初始化 
  */
 {
  System.out.println("非靜態的參數初始化  ");
 }

}

運行結果如下:

靜態的參數初始化

classForName  : [class baseJava.TestClass]

classForName2 : [class baseJava.TestClass]

非靜態的參數初始化

構造函數

newInstance  : [class baseJava.TestClass]

newInstanceHashCode  : [12677476]

newInstanceToString  : [baseJava.TestClass@c17164]

也就是說:

三種方法生成CLASS對象是一樣的,因為CLASS在JVM的名稱是一樣的,但是三種生成的方法略有不同:靜態的方法屬性初始化,是在加載類的時候初始化。而非靜態方法屬性初始化,是new類實例對象的時候加載。當我們編寫一個新的JAVA類時,JVM就會幫我們編譯成CLASS對象,存放在同名的.class文件中,在運行時,當需要生成這個類的對象時,JVM就會檢查此類是否裝載到內存中,會沒有裝載,就把.class裝載到內存中,若裝載過,則根據.class生成對象。

Copyright © Linux教程網 All Rights Reserved