# Class類 ## **基本介紹** 1. Class也是類,因此也繼承Object類; 2. Class類對象不是new出來的,而是系統創建的; 3. 對於某個類的Class類對象,在記憶體中只有一份,因為類只載入一次; 4. 每個類的實例都會記得自己是由哪個Class實例所生成的; 5. 通過 ...
Class類
基本介紹
- Class也是類,因此也繼承Object類;
- Class類對象不是new出來的,而是系統創建的;
- 對於某個類的Class類對象,在記憶體中只有一份,因為類只載入一次;
- 每個類的實例都會記得自己是由哪個Class實例所生成的;
- 通過Class對象可以完整的得到一個類的完整結構,通過一系列API;
- Class對象是存放在堆中的;
- 類的位元組碼二進位數據,是存放在方法區的,有的地方稱為類的元數據(包括方法代碼,變數名,方法名,訪問許可權等等);【https://www.zhihu.com/question/38496907】
Class類的常用方法
方法名 | 功能說明 |
---|---|
static Class forName(String name) | 返回指定類名 name 的 Class對象 |
Object newInstance() | 調用預設構造函數,返回該Class對象的一個實例 |
getName() | 返回此Class對象所表示的實體(類、介面、數組類、基本類型等)名稱 |
Class[] getInterfaces() | 獲取當前CLass對象的介面 |
ClassLoader getClassLoader() | 返回該類的類載入器 |
Class gerSuperclass() | 返回表示此Class所表示的實體的父類的Class |
ConStructor[] gerConstructors() | 返回一個包含某些Constructor對象的數組 |
Field[] getDeclaredFields() | 返回Field對象的一個數組 |
Method gerMethod(String name, Class ... paramTypes) | 返回一個Method對象,此對象的形參為paramType |
-
代碼演示
Car類:
package com.hspedu; /** * @author: 86199 * @date: 2023/5/22 10:27 * @description: */ public class Car { public String brand = "寶馬"; public int price = 500000; public String color = "白色"; @Override public String toString() { return "Car{" + "brand='" + brand + '\'' + ", price=" + price + ", color='" + color + '\'' + '}'; } }
Class02:
package com.hspedu.class_; import com.hspedu.Car; import java.lang.reflect.Field; /** * @author: 86199 * @date: 2023/5/22 10:28 * @description: 演示Class類的常用方法 */ public class Class02 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException { String classAllPath = "com.hspedu.Car"; //1. 獲取到Car類 對應的Class對象 //<?> 表示不確定java類型 Class<?> aClass = Class.forName(classAllPath); //2. 輸出 aClass System.out.println(aClass);//顯示 aClass 是哪個類的Class對象 com.hspedu.Car System.out.println(aClass.getClass());//輸出 aClass 的運行類型 java.lang.Class //3. 得到包名 System.out.println(aClass.getPackage().getName());//com.hspedu //4. 得到全類名 System.out.println(aClass.getName());//com.hspedu.Car //5. 通過 aClass 生成對象實例 Car car = (Car) aClass.newInstance(); System.out.println(car); //6. 通過反射獲取屬性 brand Field brand = aClass.getField("brand"); System.out.println(brand.get(car)); //7. 通過反射給欄位賦值 brand.set(car, "賓士"); System.out.println(brand.get(car)); //8. 得到所有的屬性 Field[] fields = aClass.getFields(); for (Field field: fields) { System.out.println(field.get(car)); } } }
獲取Class類對象
獲取Class對象的6種方式:
-
前提:已知一個類的全類名,且該類在類路徑下,可以通過Class類的靜態方法 forName()獲取,可能拋出ClassNotFoundException。實例:
Class cls1 = Class.forName("java.lang.String");
應用場景:多用於配置文件,讀取類全路徑,載入類。
-
前提:若已知具體的類,同通過類的class獲取,該方式最為安全可靠,程式性能也最高。實例:
Class cls2 = Cat.class;
應用場景:多用於參數傳遞,比如通過反射得到對應構造器對象。
-
前提:已知某個類的實例,調用該實例的getClass()方法獲取Class對象。實例:
Class cls3 = 對象.getClass();//運行類型
,所以說查看運行類型就是獲取該對象關聯的Class對象,查看其代表的類型應用場景:通過創建好的對象,獲取Class對象。
-
其他方式:通過類載入器【4種】來獲取到類的Class對象
也就是說從一個類里獲得類載入器可以用來載入出其他類//(1)先得到類載入器 ClassLoader classLoader = 對象.getClass().getClassLoader(); //(2)通過類載入器得到Class對象 Class cls4 = classLoader.loadClass("類的全類名");
彈幕摘要:
- 這種方法就是比第三種繞了一大圈;
- 從一個類里獲得類載入器可以用來載入出其他類,這隻是告訴你可以通過類載入器方式獲得類對象,不是讓你一定要這麼做,只是告訴你有這種方式;
-
基本數據類型(int, char, boolean, float, double, byte, long, short) 按如下方式得到Class類對象
Class cls = 基本數據類型.class;
-
基本數據類型的包裝類,可以通過.TYPE 得到Class類對象
Class cls = 包裝類.TYPE
代碼演示:
package com.hspedu.class_;
import com.hspedu.Car;
/**
* @author: 86199
* @date: 2023/5/22 11:13
* @description: 演示獲取Class對象的各種方式
*/
public class GetClass_ {
public static void main(String[] args) throws ClassNotFoundException {
//1. Class.forName
String classAllPath = "com.hspedu.Car";//通過讀取配置文件獲取
Class<?> cls1 = Class.forName(classAllPath);
System.out.println("cls1 = " + cls1);
//2. 類名.class
Class cls2 = Car.class;
System.out.println("cls2 = " + cls2);
//3. 對象.getClass(),應用場景,有對象實例
Car car = new Car();
Class cls3 = car.getClass();
System.out.println("cls3 = " + cls3);
//4. 通過類載入器【4種】來獲取到類的Class對象
//這種方法就是比第三種繞了一大圈,從一個類里獲得類載入器可以用來載入出其他類
//這隻是告訴你可以通過類載入器方式獲得類對象,不是讓你一定要這麼做,只是告訴你有這種方式
//(1)先得到類載入器
ClassLoader classLoader = car.getClass().getClassLoader();
//(2)通過類載入器得到Class對象
Class cls4 = classLoader.loadClass(classAllPath);
Class<?> aClass = classLoader.loadClass("java.lang.String");
System.out.println("cls4 = " + cls4);
System.out.println(aClass);
//cls1,cla2,cls3, cls4 都是同一個對象
System.out.println(cls1.hashCode());
System.out.println(cls2.hashCode());
System.out.println(cls3.hashCode());
System.out.println(cls4.hashCode());
//5. 基本數據類型(int, char, boolean, float, double, byte, long, short) 按如下方式得到Class類對象
Class<Integer> integerClass = int.class;
Class<Character> characterClass = char.class;
Class<Boolean> booleanClass = boolean.class;
System.out.println(integerClass);
//6. 基本數據類型的包裝類,可以通過.TYPE 得到Class類對象
Class<Integer> type1 = Integer.TYPE;
Class<Character> type2 = Character.TYPE;
System.out.println(type1);
System.out.println(integerClass.hashCode());
System.out.println(type1.hashCode());
}
}
/* 運行結果
cls1 = class com.hspedu.Car
cls2 = class com.hspedu.Car
cls3 = class com.hspedu.Car
cls4 = class com.hspedu.Car
class java.lang.String
460141958
460141958
460141958
460141958
int
int
1163157884
1163157884
*/
哪些類型有Class對象
- 外部類,成員內部類,靜態內部類,局部內部類,匿名內部類
- Interface介面
- 數組
- enum枚舉
- annotation註解
- 基本數據類型
- void
-
代碼演示:
package com.hspedu.class_; import java.io.Serializable; /** * @author: 86199 * @date: 2023/5/23 16:42 * @description: */ public class AllTypeClass { public static void main(String[] args) { Class<String> cls1 = String.class;//外部類 Class<Serializable> cls2 = Serializable.class;//介面 Class<float[]> cls3 = float[].class;//數組 Class<float[][]> cls4 = float[][].class;//二維數組 Class<Thread.State> cls5 = Thread.State.class;//枚舉 Class<Deprecated> cls6 = Deprecated.class;//註解 Class<Long> cls7 = long.class;//基本數據類型 Class<Void> cls8 = void.class;//void Class<Class> cls9 = Class.class;//Class類 System.out.println(cls1); System.out.println(cls2); System.out.println(cls3); System.out.println(cls4); System.out.println(cls5); System.out.println(cls6); System.out.println(cls7); System.out.println(cls8); System.out.println(cls9); } } /* 運行結果 class java.lang.String interface java.io.Serializable class [F class [[F class java.lang.Thread$State interface java.lang.Deprecated long void class java.lang.Class */