Class類介紹

       Class類是一個保存運行時信息的類,它包含了與類有關的信息。事實上,Class對象就是用來創建類的所有的“常規”對象的。Java使用Class對象來執行其RTTI(Run-Time Type Information,運行時類型信息)。

   類是程序的一部分,每個類都有一個Class對象。換句話說,每當編寫並且編譯了一個新類,就會產生一個Class對象。無論何時,只要你想在運行時使用類型信息,就必須首先獲得對恰當的Class對象的引用。Class.forName()就是實現此功能的途徑,因爲你不需要爲了獲得Class引用而持有該類型的對象。但如果你已經擁有了一個類型的對象,那就可以通過調用getClass()方法來獲取Class引用,這個方法是屬於Object類的一部分,他將返回表示該對象的實際類型的Class引用。關於Class.forName()和getClass()用法的具體區別以及理解如下:

package com.zys.test;

public class Test {
	public static void main(String[] args) {
		try {
			Class c=Class.forName("com.zys.test.Person");
			System.out.println("c ="+c);
			Person person=new Person();
			Class c1=person.getClass();
			System.out.println("c1="+c1);
			if(c==c1){
				System.out.println("c =c1");
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}
測試結果如下:

   從上面的結果可以看到,這兩種方法都是用來獲得一個Class對象的,Class.forName()不需要獲得一個Person對象,只要知道它的全限定名(包含包名)即可獲得Class對象,而getClass()方法需要通過一個已知的對象來調用從而獲得該對象的Class對象。


   Class就可以提供我們很多信息,比如屬性/方法/修飾符/構造器/類名等等。然後我們就可以進一步進行反射。不過,現在將具體介紹Class對象的重要的方法的含義及其用法:

1.getName():獲得包名和類名

public class Test {
	public static void main(String[] args) {
		Person person1=new Person("張三",12);
		Class c=person1.getClass();
		System.out.println(c.getName());
		//輸出com.zys.test.Person
	}
}

2.getSimpleName():獲得類名

public class Test {
	public static void main(String[] args) {
		Person person1=new Person("張三",12);
		Class c=person1.getClass();
		System.out.println(c.getSimpleName());
		//輸出Person
	}
}

3.getSuperclass():獲得父類的包名和類名

public class Test {
	public static void main(String[] args) {
		Student student=new Student();
		Class c=student.getClass();
		System.out.println(c.getSuperclass());
		//輸出class com.zys.test.Person
	}
}

4.getDeclaredFields(String fieldname):返回值爲Field對象,返回某個屬性的修飾符,類型,包名類名和屬性名

public class Test {
	public static void main(String[] args) {
		Person person1=new Person("張三",12);
		Class c=person1.getClass();
		try {
			System.out.println(c.getDeclaredField("name"));
			//輸出:private java.lang.String com.zys.test.Person.name
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
	}
}

5.getType():通過Field對象調用該方法,可以返回某個字段(屬性)的類型

public class Test {
	public static void main(String[] args) {
		Person person1=new Person("張三",12);
		Class c=person1.getClass();
		try {
			Field field=c.getDeclaredField("age");
			System.out.println(field.getType());
			//輸出:int
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
	}
}

6.getModifiers():通過返回int型整數值來表示該字段的修飾符


public class Test {
	public static void main(String[] args) {
		Person person1=new Person("張三",12);
		Class c=person1.getClass();
		System.out.println(c.getModifiers());
		//輸出:1
	}
}

7.Field的setAccessible(boolean falg):當某個類的成員變量爲private時,需要執行setAccessible(true)纔可通過field.get(obj)來獲得當前值。

public class Test {
	public static void main(String[] args) {
		Person person1=new Person("張三",12);
		Class c=person1.getClass();
		try {
			Field field=c.getDeclaredField("age");
			field.setAccessible(true);
			System.out.println(field.get(person1));
			//輸出:12
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
如果沒有field.setAccessible(true)這一句,將會出現以下異常:


發佈了101 篇原創文章 · 獲贊 123 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章