一笋庄、重點問題
1滑负、JVM是如何加載一個類的
2充包、JVM加載class文件的原理機制
JVM中類的裝載是由ClassLoader和它的子類來實現(xiàn)的,Java ClassLoader
是一個重要的Java運行時系統(tǒng)組件挑格。它負責(zé)在運行時查找和裝入類文件的類斤蔓。
二令花、課堂知識
2.1锦担、反射
關(guān)于反射的理解
Reflection(反射)是被視為動態(tài)語言的關(guān)鍵俭识,反射機制允許程序在執(zhí)行期借助于Reflection API取得任何
類的內(nèi)部信息,并能直接操作任意對象的內(nèi)部屬性及方法洞渔。
框架 = 反射 + 注解 + 設(shè)計模式套媚。
2.2、Class類
Class類:字節(jié)碼文件對應(yīng)的對象磁椒。
獲取Class類的實例的四種方式:
方法一:
對象.getClass()——>Class類的實例對象
Class cls1 = p1.getClass();
方法二:
類名.class——>Class類的實例對象
Class cls2 = Person.class;
方法三:
Class類提供了一個靜態(tài)的方法:forName()
Class cls3 = Class.forName("包名.類名");
方式四:使用類的加載器:ClassLoader (了解)
? ? ? ? ClassLoader classLoader = ReflectionTest.class.getClassLoader();
? ? ? ? Class clazz4 = classLoader.loadClass("包名.類名");
2.3堤瘤、Constructor
//step1:獲取Class類實例:
Class<?> cls1 = Person.class;
//step2:獲取Constructor類實例:
Constructor<?> constructor2 = cls1.getConstructor(String.class,int.class);//public Person(String, int){}
//step3:根據(jù)構(gòu)造方法實例,創(chuàng)建類的對象:Person對象
Person p2 = (Person) constructor2.newInstance("name",age);
獲取構(gòu)造方法:
獲取構(gòu)造方法:
1浆熔、獲取所有的public的構(gòu)造方法:數(shù)組
Constructor<?>[]getConstructors()
2本辐、獲取單個的public的構(gòu)造方法:具體的某一個構(gòu)造方法
Constructor<T>getConstructor(Class<?>...parameterTypes)
3、獲取所有的構(gòu)造方法:數(shù)據(jù)
Constructor<?>[]getDeclaredConstructors()
4、獲取單個構(gòu)造方法:具體的某一個構(gòu)造方法
Constructor<T>getDeclaredConstructor(Class<?>...parameterTypes)
創(chuàng)建對象
T newInstance(Object... initargs)
使用此 Constructor 對象表示的構(gòu)造方法來創(chuàng)建該構(gòu)造方法的聲明類的新實例慎皱,并用指定的初始化參數(shù)初始化該實例老虫。
2.4、Field
思路:
//step1:獲取Class類的實例
//step2:獲取Field類實例茫多,表示屬性
//step3:訪問實例的屬性祈匙,進行賦值
獲取Field實例:
.Field getDeclaredField(String name)
? ? ? ? ? 返回一個 Field 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明字段地梨。 /
.Field[] getDeclaredFields()
? ? ? ? ? 返回 Field 對象的一個數(shù)組菊卷,這些對象反映此 Class 對象所表示的類或接口所聲明的所有字段。
操作屬性:
A:設(shè)置是否可以訪問:
field.setAccessible(true);
B:設(shè)置某個實例的該屬性值
field.set(對象宝剖,數(shù)據(jù));
2.5洁闰、Method
獲取方法:
Method getMethod(String name, Class<?>... parameterTypes)
? ? ? ? ? 返回一個 Method 對象,它反映此 Class 對象所表示的類或接口的指定公共成員方法万细。
Method[] getMethods() ;//本類的和父類的public類型的方法扑眉。
? ? ? ? ? 返回一個包含某些 Method 對象的數(shù)組,這些對象反映此 Class 對象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共 member 方法赖钞。
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
? ? ? ? ? 返回一個 Method 對象腰素,該對象反映此 Class 對象所表示的類或接口的指定已聲明方法。
Method[] getDeclaredMethods() //獲取本類中所有的方法雪营,但是不包括繼承來的
? ? ? ? ? 返回 Method 對象的一個數(shù)組弓千,這些對象反映此 Class 對象表示的類或接口聲明的所有方法,包括公共献起、保護洋访、默認(包)訪問和私有方法,但不包括繼承的方法谴餐。