摘要:分類根類加載器也被稱為引導類加載器,負責核心類的加載比如等。要想解剖一個類必須先要獲取到該類的字節(jié)碼文件對象。
這是劉意老師的JAVA基礎(chǔ)教程的筆記
講的賊好,附上傳送門
傳智風清揚-超全面的Java基礎(chǔ)
一、類的加載 1.類初始化的時機創(chuàng)建類的實例
訪問類的靜態(tài)變量,或者為靜態(tài)變量賦值
調(diào)用類的靜態(tài)方法
使用反射方式來強制創(chuàng)建某個類或接口對應(yīng)的java.lang.Class對象
初始化某個類的子類
直接使用java.exe命令來運行某個主類
2.1.作用
負責將.class文件加載到內(nèi)在中,并為之生成對應(yīng)的Class對象。
雖然我們不需要關(guān)心類加載機制,但是了解這個機制我們就能更好的理解程序的運行。
2.2.分類
Bootstrap ClassLoader 根類加載器
也被稱為引導類加載器,負責Java核心類的加載
比如System,String等。在JDK中JRE的lib目錄下rt.jar文件中
Extension ClassLoader 擴展類加載器
負責JRE的擴展目錄中jar包的加載。
在JDK中JRE的lib目錄下ext目錄
Sysetm ClassLoader 系統(tǒng)類加載器
負責在JVM啟動時加載來自java命令的class文件,以及classpath環(huán)境變量所指定的jar包和類路徑
JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。要想解剖一個類,必須先要獲取到該類的字節(jié)碼文件對象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個字節(jié)碼文件對應(yīng)的Class類型的對象.
class類包含:
成員變量 Field
構(gòu)造方法 Consturctor
成員方法 Method
并且把這三個東西都看做對象
1.獲取class文件對象的三種方式public class Demo { public static void main(String[] args) throws ClassNotFoundException { //方式1 Person p=new Person(); Class c=p.getClass(); Person p2=new Person(); Class c2=p.getClass(); System.out.println(p==p2); System.out.println(c==c2); //方式2 Class c3=Person.class; //方式3 Class c4=Class.forName("demo1.Person");//要全路徑 } }2.通過反射獲取無參構(gòu)造方法并使用
package demo1; import java.lang.reflect.Constructor; public class Demo { public static void main(String[] args) throws Exception { Class c = Class.forName("demo1.Person");// 要全路徑 // 獲取構(gòu)造方法 System.out.println("獲取public構(gòu)造方法"); Constructor[] cons = c.getConstructors(); for (Constructor constructor : cons) { System.out.println(constructor); } System.out.println("獲取所有構(gòu)造方法"); cons = c.getDeclaredConstructors(); for (Constructor constructor : cons) { System.out.println(constructor); } System.out.println("運用class字節(jié)碼文件獲取某個構(gòu)造方法對象,并創(chuàng)建該類的實例"); Constructor con = c.getConstructor(); Object obj=con.newInstance(); System.out.println(con); } } class Person { // 成員變量 private String name; int age; public String address; // 構(gòu)造方法 public Person() { } Person(String name, int age) { this.name = name; this.age = age; } public Person(String name, int age, String address) { super(); this.name = name; this.age = age; this.address = address; } // 成員方法 public void show() { System.out.println("show"); } public void method(String s) { System.out.println("method" + s); } public String getString(String s, int i) { return s + "---" + i; } private void function() { System.out.println("function"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + "]"; } }3.通過反射去獲得含參構(gòu)造方法
package demo1; import java.lang.reflect.Constructor; public class Demo { public static void main(String[] args) throws Exception { Class c = Class.forName("demo1.Person");// 要全路徑 System.out.println("運用class字節(jié)碼文件獲取某個構(gòu)造方法對象,并創(chuàng)建該類的實例"); Constructor con = c.getConstructor(String.class, int.class, String.class); Object obj = con.newInstance("zxy",23,"Xi"an"); System.out.println(obj); } } class Person { // 成員變量 private String name; int age; public String address; // 構(gòu)造方法 public Person() { } Person(String name, int age) { this.name = name; this.age = age; } public Person(String name, int age, String address) { super(); this.name = name; this.age = age; this.address = address; } // 成員方法 public void show() { System.out.println("show"); } public void method(String s) { System.out.println("method" + s); } public String getString(String s, int i) { return s + "---" + i; } private void function() { System.out.println("function"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + "]"; } }4.獲取私有構(gòu)造方法
package demo1; import java.lang.reflect.Constructor; public class Demo { public static void main(String[] args) throws Exception { Class c = Class.forName("demo1.Person");// 要全路徑 System.out.println("運用class字節(jié)碼文件獲取某個構(gòu)造方法對象,并創(chuàng)建該類的實例"); Constructor con = c.getDeclaredConstructor(String.class); con.setAccessible(true);//取消Java語言的訪問檢查 Object obj = con.newInstance("zxy"); System.out.println(obj); } } class Person { // 成員變量 private String name; int age; public String address; // 構(gòu)造方法 public Person() { } Person(String name, int age) { this.name = name; this.age = age; } private Person(String name) { this.name = name; } public Person(String name, int age, String address) { super(); this.name = name; this.age = age; this.address = address; } // 成員方法 public void show() { System.out.println("show"); } public void method(String s) { System.out.println("method" + s); } public String getString(String s, int i) { return s + "---" + i; } private void function() { System.out.println("function"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + "]"; } }5.通過反射調(diào)用方法
package demo1; import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class Demo { public static void main(String[] args) throws Exception { Class c = Class.forName("demo1.Person");// 要全路徑 Constructor con = c.getConstructor(); Object obj = con.newInstance(); Method m1 = c.getMethod("show");//獲取方法對象 m1.invoke(obj);//調(diào)用哪個對象的這個方法 Method m2 = c.getMethod("method", String.class); m2.invoke(obj, "123"); Method m3 = c.getDeclaredMethod("function"); m3.setAccessible(true); m3.invoke(obj); } } class Person { // 成員變量 private String name; int age; public String address; // 構(gòu)造方法 public Person() { } Person(String name, int age) { this.name = name; this.age = age; } private Person(String name) { this.name = name; } public Person(String name, int age, String address) { super(); this.name = name; this.age = age; this.address = address; } // 成員方法 public void show() { System.out.println("show"); } public void method(String s) { System.out.println("method" + s); } public String getString(String s, int i) { return s + "---" + i; } private void function() { System.out.println("function"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + "]"; } }6.通過反射調(diào)用成員變量
package demo1; import java.lang.reflect.Constructor; import java.lang.reflect.Field; public class Demo { public static void main(String[] args) throws Exception { Class c = Class.forName("demo1.Person");// 要全路徑 Constructor con=c.getConstructor(); Object obj=con.newInstance(); Field addressField = c.getField("address"); addressField.set(obj, "xian"); System.out.println(obj); } } class Person { // 成員變量 private String name; int age; public String address; // 構(gòu)造方法 public Person() { } Person(String name, int age) { this.name = name; this.age = age; } private Person(String name) { this.name = name; } public Person(String name, int age, String address) { super(); this.name = name; this.age = age; this.address = address; } // 成員方法 public void show() { System.out.println("show"); } public void method(String s) { System.out.println("method" + s); } public String getString(String s, int i) { return s + "---" + i; } private void function() { System.out.println("function"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + "]"; } }7.通過用戶的增刪改查和學生登錄注冊引入中介 三、動態(tài)代理
代理:本來應(yīng)該自己做的事情,卻請了別人來做,被請的人就是代理對象。
舉例:春季回家買票讓人代買
動態(tài)代理:在程序運行過程中產(chǎn)生的這個對象
而程序運行過程中產(chǎn)生對象其實就是我們剛才反射講解的內(nèi)容,所以,動態(tài)代理其實就是通過反射來生成一個代理
(我也沒太聽懂)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67509.html
摘要:但是模塊化當中,無法掃描只有模塊中可以使用有兩種解決方案定義一個專門的資源模塊,并使用提供的接口,實現(xiàn)它,并將這個實現(xiàn)注冊為服務(wù)。有兩種方式使用或包名,包名模塊名使用運行時動態(tài)。 模塊設(shè)計的原則: 1、防止出現(xiàn)編譯時循環(huán)依賴(主要是編譯器不支持),但運行時是允許循環(huán)依賴的,比如GUI應(yīng)用2、明確模塊的邊界 幾種模塊設(shè)計: API模塊,聚合模塊(比如java.base) 可選依賴 兩種方...
摘要:在設(shè)計模式中,所有的設(shè)計模式都遵循這一原則。其實就是說在應(yīng)用程序中,所有的類如果使用或依賴于其他的類,則應(yīng)該依賴這些其他類的抽象類,而不是這些其他類的具體類。使用設(shè)計模式是為了可重用代碼讓代碼更容易被他人理解保證代碼可靠性。 這是劉意老師的JAVA基礎(chǔ)教程的筆記講的賊好,附上傳送門 傳智風清揚-超全面的Java基礎(chǔ) 一、面向?qū)ο笏枷朐O(shè)計原則 1.單一職責原則 其實就是開發(fā)人員經(jīng)常說的高...
摘要:一個進程如果有多條執(zhí)行路徑,則稱為多線程程序。這可能拋出在當前線程中??紤]多線程的數(shù)據(jù)安全問題是否是多線程環(huán)境。當前線程必須擁有此對象監(jiān)視器。此方法導致當前線程稱之為將其自身放置在對象的等待集中,然后放棄此對象上的所有同步要求。 這是劉意老師的JAVA基礎(chǔ)教程的筆記講的賊好,附上傳送門 傳智風清揚-超全面的Java基礎(chǔ) 一、線程的引入 1.多線程概述 進程 a.正在運行的程序,是...
摘要:本文是作者自己對中線程的狀態(tài)線程間協(xié)作相關(guān)使用的理解與總結(jié),不對之處,望指出,共勉。當中的的數(shù)目而不是已占用的位置數(shù)大于集合番一文通版集合番一文通版垃圾回收機制講得很透徹,深入淺出。 一小時搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法。Annotion(注解) 是一個接口,程序可以通過...
摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領(lǐng)導們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...
閱讀 3132·2021-11-15 18:14
閱讀 1785·2021-09-22 10:51
閱讀 3300·2021-09-09 09:34
閱讀 3515·2021-09-06 15:02
閱讀 1034·2021-09-01 11:40
閱讀 3194·2019-08-30 13:58
閱讀 2535·2019-08-30 11:04
閱讀 1089·2019-08-28 18:31