day43-反射02( 二 )

3.獲取Class類對象的各種方式

  1. 前提:已經知道一個類的全類名,且該類在類路徑下,可通過Class類的靜態方法forName()獲取,可能拋出ClassNotFoundException
    實例:Class cls1 = Class.forName("java.lang.Cat");
    應用場景:多用于配置文件 , 讀取類全路徑,加載類
  2. 前提:若已知具體的類,通過 類.class 獲取,該方式最為安全可靠,程序性能最高
    實例:Class cls2 = Cat.class;
    應用場景:多用于參數傳遞 , 比如通過反射得到對應構造器對象
  3. 前提:已某個類的實例,調用該實例的getClass()方法獲取Class對象
    實例:Class cls3 = 對象.getClass();//運行類型
    應用場景:通過創建好的對象,獲取Class對象
  4. 其他方式
    ClassLoader cl = 對象.getClass().getClassLoad();
    Class cls4 = cl.loadClass("類的全類名");
  5. 基本數據類型byte,short,int,long,double,float,boolean.char, 按如下方式得到Class類對象
    Class cls = 基本數據類型.class
  6. 基本數據類型對應的包裝類,可以通過.TYPE得到Class類對象
    Class cls = 包裝類.TYPE
例子:
package li.reflection.class_;import li.reflection.Car;//演示得到Class對象的各種方式public class getClass_ {public static void main(String[] args) throws ClassNotFoundException {//1.Class.forNameString classAllPath = "li.reflection.Car";//這里一般是通過配置文件獲取全路徑Class cls1 = Class.forName(classAllPath);System.out.println(cls1);//class li.reflection.Car//2.類名.class ,多用于參數傳遞Class cls2 = Car.class;System.out.println(Car.class);//class li.reflection.Car//3.對象.getClass() ,應用場景,有對象實例Car car = new Car();Class cls3 = car.getClass();System.out.println(cls3);//class li.reflection.Car//4.通過類加載器(4種)來獲取到類的 Class對象//(1)先得到car對象的類加載器(每個對象都有一個類加載器)ClassLoader classLoader = car.getClass().getClassLoader();//(2)通過類加載器得到Class對象Class cls4 = classLoader.loadClass(classAllPath);System.out.println(cls4);//class li.reflection.Car//cls1,cls2,cls3,cls4其實是同一個Class對象System.out.println(cls1.hashCode());//1554874502System.out.println(cls2.hashCode());//1554874502System.out.println(cls3.hashCode());//1554874502System.out.println(cls4.hashCode());//1554874502//5.基本數據類型按如下方式得到Class類對象Class<Integer> integerClass = int.class;Class<Character> characterClass = char.class;Class<Boolean> booleanClass = boolean.class;System.out.println(integerClass);//intSystem.out.println(characterClass);//charSystem.out.println(booleanClass);//boolean//6.基本數據類型對應的8種包裝類,可以通過 .TYPE得到Class類對象Class<Integer> type1 = Integer.TYPE;Class<Character> type2 = Character.TYPE;System.out.println(type1);System.out.println(integerClass.hashCode());//1846274136System.out.println(type1.hashCode());//1846274136}}4.哪些類有Class對象
  1. 外部類,成員內部類 , 靜態內部類 , 局部內部類,匿名內部類
  2. interface:接口
  3. 數組
  4. enum:枚舉
  5. annotation:注解
  6. 基本數據類型
  7. void
例子:
package li.reflection.class_;import java.io.Serializable;//演示哪些類有Class對象public class allTypeClass {public static void main(String[] args) {Class<String> cls1 = String.class;//外部類Class<Serializable> cls2 = Serializable.class;//接口Class<Integer[]> cls3 = Integer[].class;//數組Class<float[][]> cls4 = float[][].class;//二維數組Class<Deprecated> cls5 = Deprecated.class;//注解//Thread類中的枚舉State--用來表示線程狀態Class<Thread.State> cls6 = Thread.State.class;//枚舉Class<Long> cls7 = long.class;//基本數據類型Class<Void> cls8 = void.class;//void類型Class<Class> cls9 = Class.class;//Class類也有System.out.println(cls1);//class java.lang.StringSystem.out.println(cls2);//interface java.io.SerializableSystem.out.println(cls3);//class [Ljava.lang.Integer;System.out.println(cls4);//class [[FSystem.out.println(cls5);//interface java.lang.DeprecatedSystem.out.println(cls6);//class java.lang.Thread$StateSystem.out.println(cls7);//longSystem.out.println(cls8);//voidSystem.out.println(cls9);//class java.lang.Class}}5.類加載
day43-反射02

文章插圖