java反射(二):獲取Class類的四種方式
阿新 • • 發佈:2019-01-25
我們建立了一個類,通過編譯(javac.exe),生成對應的.class檔案,之後使用java.exe(JVM的類載入器來完成)載入此.class檔案,此.class檔案載入到記憶體以後,就是一個執行時類,存放在快取區,這個執行時類就是一個
Class的例項。
java.lang.class是反射的源頭。
它有如下幾個特點:
1.每一個執行時類只加載一次
2.有了Class的例項之後,我們才可以進行如下的操作:
2.1)建立對應的執行時類的物件
2.2)獲取對應的執行時類的完整結構(屬性、方法、構造器、內部類、父類、所在包、註解、異常…)
2.3)呼叫對應的執行時類的指定的結構(屬性、方法、構造器)
2.4)反射的應用:動態代理。
在正常方式下:我們需要引入需要的“包類”名稱——通過new例項化——取得例項化的物件
反射方式:例項化物件——getClass()方法——得到完整的“包類”名稱。
這相當於是一個倒序的過程。
如何獲取Class例項呢?
Class只有在例項後才能開始進行反射。下面是例項化的四種方式:
1.呼叫執行時類本身的.class屬性
Class clazz1 =Person.class; System.out.println(clazz1.getName()); Class clazz2 = String.class; System.out.println(clazz2.getName);
2.通過執行時類的物件獲取
Person p =new Person();
Class clazz3 = p.getClass();
System.out.prinln(clazz3.getName());<strong>
</strong>
3.
通過Class的靜態方法獲取(反射的動態性)
String className ="com.arguigu.java.Person"; Class clazz4 = Class.forName(className); //clazz4.newInstance(); System.out.prinln(clazz4.getName());
4.通過類的載入器
ClassLoader classLoader = this.getClass().getClassLoader();
Class clazz5 = classLoader.loadClass(className);
System.out.println(clazz5.getName());
用途:
1.可以建立對應的執行時類的物件
2.獲取對應的執行時類的完整的類的結構:屬性/方法/構造器/包/父類/泛型/註解/異常/內部類…
3.可以呼叫對應的執行時類中指定的結構(某個指定的屬性/方法/構造器)
以上就是Class例項化的四種方式,下一篇介紹第四種類載入器ClassLoader的使用。