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