java实现匿名接口内存泄漏_解决内存泄漏更加清楚的认识到Java匿名类与外部类的关系...

{

final java.lang.String val$s;

final Hello this$0;

Hello$1(Hello, java.lang.String);

Code:

Stack=2, Locals=3, Args_size=3

0:aload_0

1:aload_1

2:putfield#1; //Field this$0:LHello;

5:aload_0

6:aload_2

7:putfield#2; //Field val$s:Ljava/lang/String;

10:aload_0

11:aload_1

12:invokespecial#3; //Method Hello$Demo."":(LHello;)V

15:return

LineNumberTable:

line 8: 0

public void show();

Code:

Stack=3, Locals=1, Args_size=1

0:getstatic#4; //Field java/lang/System.out:Ljava/io/PrintStream;

3:new#5; //class java/lang/StringBuilder

6:dup

7:invokespecial#6; //Method java/lang/StringBuilder."":()V

10:ldc#7; //String s=

12:invokevirtual#8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

15:aload_0

16:getfield#2; //Field val$s:Ljava/lang/String;

19:invokevirtual#8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

22:invokevirtual#9; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;

25:invokevirtual#10; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

28:getstatic#4; //Field java/lang/System.out:Ljava/io/PrintStream;

31:new#5; //class java/lang/StringBuilder

34:dup

35:invokespecial#6; //Method java/lang/StringBuilder."":()V

38:ldc#11; //String name=

40:invokevirtual#8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

43:aload_0

44:getfield#1; //Field this$0:LHello;

47:invokestatic#12; //Method Hello.access$000:(LHello;)Ljava/lang/String;

50:invokevirtual#8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

53:invokevirtual#9; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;

56:invokevirtual#10; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

59:return

LineNumberTable:

line 10: 0

line 11: 28

line 12: 59

}

我们可以看到这个匿名类多了两个成员变量

final java.lang.String val$s与

final Hello this$0;在看下这个匿名类的构造函数

Hello$1(Hello, java.lang.String);刚好是对两个成员变量进行赋值。this$0指向了外部类对象的引用,val$s指向了方法showDemo(final String s)的参数s所指向内存的引用。在看看匿名类是怎么访问外部类的成员变量呢?看下这几行汇编代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值