再次证明JDK1.5泛型实现原理

在这篇文章中用Jad说明了JDK1.5中的泛型是擦拭法实现,实际是通过编绎前处理,或者编译器实现的。但有人说Jad还不支持1.5的语法,那么从另一个角度证明一下,就有了这篇文章。

None.gif import  java.util.ArrayList;
None.gif
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public   class  Generic  dot.gif {
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public   static   void  main(String[] args)  dot.gif {
InBlock.gif        ArrayList list1 
=   new  ArrayList();
InBlock.gif        list1.add(
" 1 " );
InBlock.gif        String str1 
=  (String)list1.get( 0 );
InBlock.gif        
InBlock.gif        ArrayList
< String >  list2  =   new  ArrayList < String > ();
InBlock.gif        list2.add(
" 1 " );
InBlock.gif        String str2 
=  list2.get( 0 );
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

取得上边这段代码的字节码:( 如何取得字节码见这里)
None.gif //  class version 49.0 (49)
None.gif
//  access flags 33
ExpandedBlockStart.gifContractedBlock.gif
public   class  Generic  dot.gif {
InBlock.gif
InBlock.gif  
// compiled from: Generic.java
InBlock.gif
InBlock.gif  
// access flags 1
InBlock.gif
  public <init>()V
InBlock.gif   L0 (
0)
InBlock.gif    LINENUMBER 
4 L0
InBlock.gif    ALOAD 
0
InBlock.gif    INVOKESPECIAL java
/lang/Object.<init>()V
InBlock.gif    RETURN
InBlock.gif   L1 (
4)
InBlock.gif    LOCALVARIABLE 
this LGeneric; L0 L1 0
InBlock.gif    MAXSTACK 
= 1
InBlock.gif    MAXLOCALS 
= 1
InBlock.gif
InBlock.gif  
// access flags 9
InBlock.gif
  public static main([Ljava/lang/String;)V
InBlock.gif   L0 (
0)
InBlock.gif    LINENUMBER 
7 L0
InBlock.gif    NEW java
/util/ArrayList
InBlock.gif    DUP
InBlock.gif    INVOKESPECIAL java
/util/ArrayList.<init>()V
InBlock.gif    ASTORE 
1
InBlock.gif   L1 (
5)
InBlock.gif    LINENUMBER 
8 L1
InBlock.gif    ALOAD 
1
InBlock.gif    LDC 
"1"
InBlock.gif    INVOKEVIRTUAL java
/util/ArrayList.add(Ljava/lang/Object;)Z
InBlock.gif    POP
InBlock.gif   L2 (
10)
InBlock.gif    LINENUMBER 
9 L2
InBlock.gif    ALOAD 
1
InBlock.gif    ICONST_0
InBlock.gif    INVOKEVIRTUAL java
/util/ArrayList.get(I)Ljava/lang/Object;
InBlock.gif    CHECKCAST java
/lang/String
InBlock.gif    ASTORE 
2
InBlock.gif   L3 (
16)
InBlock.gif    LINENUMBER 
11 L3
InBlock.gif    NEW java
/util/ArrayList
InBlock.gif    DUP
InBlock.gif    INVOKESPECIAL java
/util/ArrayList.<init>()V
InBlock.gif    ASTORE 
3
InBlock.gif   L4 (
21)
InBlock.gif    LINENUMBER 
12 L4
InBlock.gif    ALOAD 
3
InBlock.gif    LDC 
"1"
InBlock.gif    INVOKEVIRTUAL java
/util/ArrayList.add(Ljava/lang/Object;)Z
InBlock.gif    POP
InBlock.gif   L5 (
26)
InBlock.gif    LINENUMBER 
13 L5
InBlock.gif    ALOAD 
3
InBlock.gif    ICONST_0
InBlock.gif    INVOKEVIRTUAL java
/util/ArrayList.get(I)Ljava/lang/Object;
InBlock.gif    CHECKCAST java
/lang/String
InBlock.gif    ASTORE 
4
InBlock.gif   L6 (
32)
InBlock.gif    LINENUMBER 
14 L6
InBlock.gif    RETURN
InBlock.gif   L7 (
34)
InBlock.gif    LOCALVARIABLE args [Ljava
/lang/String; L0 L7 0
InBlock.gif    LOCALVARIABLE list1 Ljava
/util/ArrayList; L1 L7 1
InBlock.gif    LOCALVARIABLE str1 Ljava
/lang/String; L3 L7 2
InBlock.gif    LOCALVARIABLE list2 Ljava
/util/ArrayList; L4 L7 3
InBlock.gif    
// signature Ljava/util/ArrayList<Ljava/lang/String;>;
InBlock.gif    
// declaration: java.util.ArrayList<java.lang.String>
InBlock.gif
    LOCALVARIABLE str2 Ljava/lang/String; L6 L7 4
InBlock.gif    MAXSTACK 
= 2
InBlock.gif    MAXLOCALS 
= 5
ExpandedBlockEnd.gif}

None.gif
仔细看一下,每个代码块对应的都有
INVOKEVIRTUAL java/util/ArrayList.get(I)Ljava/lang/Object;
CHECKCAST java/lang/String
有没有泛型的字节码是一样的,说明在运行时,都进行了转型,所以说上一篇文章的说明应改是正确的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值