15_Java反射機制——2-理解Class類並獲取Class例項
阿新 • • 發佈:2020-08-29
目錄
1、Class類的理解
- 1、在Object類中定義了,public final Class getClass(),此方法被所有子類繼承。Class類是Java反射的源頭,從程式的執行結果來看反射,即通過物件反射出類的名稱。
- 2、類載入的過程(將位元組碼檔案載入到記憶體中的過程)
1)、使用 javac.exe 命令將 類名.java檔案,編譯為類名.class檔案。 2)、使用 java.exe 命令將 類名.class檔案,載入到記憶體中,並解釋執行。 3)、載入到記憶體中的類,稱為執行時類,一個類名.class檔案對應一個執行時類,也就是Class類的一個例項。
2、獲取Class類的例項(四種方法)
- 1、已知具體的類,呼叫執行時類的class屬性,該方法最為安全可靠,程式效能最高。
- 2、已知類的例項,通過執行時類的例項,呼叫getClass() 方法
- 3、已知類的全類名,且該類在類路徑下,在通過Class類的靜態方法forName(),可能丟擲ClassNotFoundException
- 4、通過類載入器ClassLoader(瞭解即可)
example1
@Test void testPerson3() throws ClassNotFoundException { // 方式一: 呼叫執行時類的class屬性 Class clazz1 = Person.class; System.out.println(clazz1); System.out.println("*********"); // 方式二: 通過執行時類的物件, 呼叫getClass()方法 Person person = new Person(); Class clazz2 = person.getClass(); System.out.println(clazz2); System.out.println("*********"); // 方式三: 呼叫Class類的靜態方法——forName(), 注意可能丟擲 ClassNotFoundException Class clazz3 = Class.forName("main.java.com.atzwx.reflection.Person"); System.out.println(clazz3); System.out.println("*********"); // 方式四: 通過類的載入器——ClassLoader(瞭解即可) ClassLoader classLoader = this.getClass().getClassLoader(); Class clazz4 = classLoader.loadClass("main.java.com.atzwx.reflection.Person"); System.out.println(clazz4); }
output
class main.java.com.atzwx.reflection.Person
*********
Person()
class main.java.com.atzwx.reflection.Person
*********
class main.java.com.atzwx.reflection.Person
*********
class main.java.com.atzwx.reflection.Person
3、哪些型別可以有Class物件
- 1、class-類
- 2、interface-介面
- 3、enum-列舉
- 4、[]-陣列
- 5、annotation-註解@interface
- 6、primitive type-基本型別
- 7、void
example2
@Test
void testPerson4() {
Class<Object> clazz1 = Object.class;
Class<Comparable> clazz2 = Comparable.class;
Class<String> clazz3 = String.class;
Class<int[]> clazz4 = int[].class;
Class<ElementType> clazz5 = ElementType.class;
Class<Override> clazz6 = Override.class;
Class<Integer> clazz7 = int.class;
Class<Void> clazz8 = void.class;
Class<Class> clazz9 = Class.class;
System.out.println("Object: " + clazz1);
System.out.println("Comparable: " + clazz2);
System.out.println("String: " + clazz3);
System.out.println("int[]: " + clazz4);
System.out.println("ElementType: " + clazz5);
System.out.println("Override: " + clazz6);
System.out.println("Integer(int): " + clazz7);
System.out.println("Void: " + clazz8);
System.out.println("Class: " + clazz9);
int[] a = new int[10];
int[] b = new int[100];
Class clazz10 = a.getClass();
Class clazz11 = b.getClass();
// 只要陣列的元素型別與維度一樣, 就是同一個Class
System.out.println(clazz10 == clazz11); // true
}
output
Object: class java.lang.Object
Comparable: interface java.lang.Comparable
String: class java.lang.String
int[]: class [I
ElementType: class java.lang.annotation.ElementType
Override: interface java.lang.Override
Integer(int): int
Void: void
Class: class java.lang.Class
true