1. 程式人生 > 實用技巧 >15_Java反射機制——2-理解Class類並獲取Class例項

15_Java反射機制——2-理解Class類並獲取Class例項

目錄

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