動態代理的記憶體分析

飛翔中初學者發表於2016-12-18

動態代理的記憶體分析

本文章是作者用於記憶學習的,水平有限,如有錯誤,希望指點。

  • 程式碼
  • 分析
  • 記憶體圖

程式碼

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的記憶體圖

這裡寫圖片描述

相關文章