動態代理的記憶體分析
動態代理的記憶體分析
本文章是作者用於記憶學習的,水平有限,如有錯誤,希望指點。
- 程式碼
- 分析
- 記憶體圖
程式碼
- public interface ISingStar{
- public void sing(int price){};
- public void dance(int price){};
- public void eat(int price){};
} - public class TaiwanStar implemets ISingStar{
- private String name;
- @override
- public void dance(int price){
- System.out.println(name+”正在跳舞!”);
- @override
- public void sing(int price){
- System.out.println(name+”正在唱歌!”);
- public String getName(){
- return name;
- }
- public void setName(){
- super();
- this.name=name;
- }
- public TaiwanStart(String name)
- super();
- this.name=name;
- }
- public TaiwanStar(){
- }
- }
- public class StarInvocation implements InvocationHandler{
- private ISingStar star;
- public StartInvocation(ISingStar star){
- super();
- this.star=star;
- }
- @override
- public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
- System.out.println(“StarInvocation.invoke():真正的歌星唱歌前!”);
- int p=(Integer)args[0];
- if(p>10000){
- return method.invoke(star,args);
- }else{
- System.out.println(“錢太少!”);
- return null;
- } }
- }
- public class Test{
- public static void main(String [] args){
- ISingStar s1=new TaiwanStar(“周杰倫”);
- StarInvocation sh=new StarInvocation(s1);
- ISingStar pro=(ISingStar)Proxy.newProxyInstance(Test.class.getClassLoader(),new Class[]{ISingStar.class},sh);
- pro.dance(3000);
- }
}
分析
進入test.main(),首先方法區和堆中建立相關資訊,在棧中建立引用,關係如下圖所示,sh物件是處理真是的SingStar和代理類 pro之間的邏輯關係的類,建立pro代理類時,(ISingStar)Proxy.newProxyInstance(Test.class.getClassLoader(),new Class[]{ISingStar.class},sh),第一個引數是類載入器物件(由類載入器建立),載入器的作用是從硬碟把.class物件載入到記憶體中去。第二個引數,就是要構建的假的class物件。第三個引數是將sh引用放到pro代理物件中去。當呼叫pro.dance(3000)時,其實是呼叫了sh.invoke()方法。
執行test的記憶體圖
相關文章
- 動態記憶體管理記憶體
- 動態記憶體分配記憶體
- 簡單理解動態記憶體分配和靜態記憶體分配的區別記憶體
- C++ 動態記憶體分配C++記憶體
- 動態分配記憶體地址(.NET)記憶體
- C++動態記憶體分配C++記憶體
- 動態代理-cglib分析CGLib
- C語言之動態記憶體管理C語言記憶體
- C語言(動態記憶體分配)C語言記憶體
- ABAP Memory Inspector 裡對動態記憶體物件的記憶體消耗度量方式記憶體物件
- C++動態記憶體管理——new/deleteC++記憶體delete
- C++ 指標動態記憶體分配C++指標記憶體
- 基於JDK的動態代理原理分析JDK
- 記憶體分析與記憶體洩漏定位記憶體
- 自動共享記憶體管理 自動記憶體管理 手工記憶體管理記憶體
- Ubuntu記憶體分析Ubuntu記憶體
- JVM記憶體分析JVM記憶體
- 記憶體溢位的分析記憶體溢位
- C++中的動態記憶體與智慧指標C++記憶體指標
- QQ群裡關於動態記憶體的問題記憶體
- 關於redis記憶體分析,記憶體優化Redis記憶體優化
- C和C++的動態記憶體管理的區別C++記憶體
- Java代理(jdk靜態代理、動態代理和cglib動態代理)JavaJDKCGLib
- Java動態編譯優化——ZipFileIndex記憶體洩漏問題分析解決Java編譯優化Index記憶體
- java陣列的記憶體分析Java陣列記憶體
- Swoole 原始碼分析——記憶體模組之記憶體池原始碼記憶體
- 靜態代理和動態代理
- JAVA 靜態代理 & 動態代理Java
- 記憶體效能分析工具記憶體
- nginx共享記憶體分析Nginx記憶體
- Java 物件記憶體分析Java物件記憶體
- Go記憶體逃逸分析Go記憶體
- swoole記憶體管理分析記憶體
- Oracle記憶體全面分析Oracle記憶體
- 轉:Oracle 記憶體分析Oracle記憶體
- Java記憶體分析一Java記憶體
- 11-記憶體分析記憶體
- 動態記憶體的賦值和修改(Android之JNI)記憶體賦值Android