动态代理的内存分析

动态代理的内存分析

本文章是作者用于记忆学习的,水平有限,如有错误,希望指点。

  • 代码
  • 分析
  • 内存图

代码

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的内存图

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值