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