`
dreamstone
  • 浏览: 288462 次
  • 来自: ...
文章分类
社区版块
存档分类

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

阅读更多

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

import  java.util.ArrayList;


public   class  Generic  {

    
public   static   void  main(String[] args)  {
        ArrayList list1 
=   new  ArrayList();
        list1.add(
" 1 " );
        String str1 
=  (String)list1.get( 0 );
        
        ArrayList
< String >  list2  =   new  ArrayList < String > ();
        list2.add(
" 1 " );
        String str2 
=  list2.get( 0 );
    }


}

取得上边这段代码的字节码:(如何取得字节码见这里)
// class version 49.0 (49)
// access flags 33
public class Generic {

  
// compiled from: Generic.java

  
// access flags 1
  public <init>()V
   L0 (
0)
    LINENUMBER 
4 L0
    ALOAD 
0
    INVOKESPECIAL java
/lang/Object.<init>()V
    RETURN
   L1 (
4)
    LOCALVARIABLE 
this LGeneric; L0 L1 0
    MAXSTACK 
= 1
    MAXLOCALS 
= 1

  
// access flags 9
  public static main([Ljava/lang/String;)V
   L0 (
0)
    LINENUMBER 
7 L0
    NEW java
/util/ArrayList
    DUP
    INVOKESPECIAL java
/util/ArrayList.<init>()V
    ASTORE 
1
   L1 (
5)
    LINENUMBER 
8 L1
    ALOAD 
1
    LDC 
"1"
    INVOKEVIRTUAL java
/util/ArrayList.add(Ljava/lang/Object;)Z
    POP
   L2 (
10)
    LINENUMBER 
9 L2
    ALOAD 
1
    ICONST_0
    INVOKEVIRTUAL java
/util/ArrayList.get(I)Ljava/lang/Object;
    CHECKCAST java
/lang/String
    ASTORE 
2
   L3 (
16)
    LINENUMBER 
11 L3
    NEW java
/util/ArrayList
    DUP
    INVOKESPECIAL java
/util/ArrayList.<init>()V
    ASTORE 
3
   L4 (
21)
    LINENUMBER 
12 L4
    ALOAD 
3
    LDC 
"1"
    INVOKEVIRTUAL java
/util/ArrayList.add(Ljava/lang/Object;)Z
    POP
   L5 (
26)
    LINENUMBER 
13 L5
    ALOAD 
3
    ICONST_0
    INVOKEVIRTUAL java
/util/ArrayList.get(I)Ljava/lang/Object;
    CHECKCAST java
/lang/String
    ASTORE 
4
   L6 (
32)
    LINENUMBER 
14 L6
    RETURN
   L7 (
34)
    LOCALVARIABLE args [Ljava
/lang/String; L0 L7 0
    LOCALVARIABLE list1 Ljava
/util/ArrayList; L1 L7 1
    LOCALVARIABLE str1 Ljava
/lang/String; L3 L7 2
    LOCALVARIABLE list2 Ljava
/util/ArrayList; L4 L7 3
    
// signature Ljava/util/ArrayList<Ljava/lang/String;>;
    
// declaration: java.util.ArrayList<java.lang.String>
    LOCALVARIABLE str2 Ljava/lang/String; L6 L7 4
    MAXSTACK 
= 2
    MAXLOCALS 
= 5
}

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

相关推荐

    JDK1.5泛型讲解和例子

    JDK1.5泛型讲解 不错的东西 对jdk需要研究的朋友不妨看看 新手也来学习学习```

    JDK1.5的泛型实现.pdf

    JDK1.5的泛型实现.pdf

    JDK1.5的泛型实现.zip

    **JDK 1.5 泛型实现** Java Development Kit (JDK) 1.5 是一个里程碑式的版本,因为它引入了泛型,这是一项重要的编程特性,极大地提高了代码的类型安全性和可读性。泛型允许在编译时进行类型检查,避免了运行时...

    JDK1.5泛型使用下载

    Java泛型是在JDK 1.5版本中引入的一项重要特性,极大地增强了类型安全性和代码可读性。泛型允许开发者在类、接口和方法中声明类型参数,从而实现对数据类型的抽象。在泛型的帮助下,开发者可以在编译时进行类型检查...

    JDK1.5泛型.rar

    **Java泛型是JDK1.5引入的一个重要特性,极大地提高了代码的类型安全性和重用性。在泛型出现之前,程序员需要在运行时进行强制类型转换,这可能导致ClassCastException。泛型通过在类、接口和方法声明中引入类型参数...

    jdk1.5x64位 windows版.zip

    其次,泛型(Generics)是JDK1.5的一大亮点。泛型允许在定义类、接口和方法时指定参数类型,增强了类型检查,减少了类型转换的麻烦,同时也减少了运行时的类型错误。泛型还引入了通配符,如"? extends T"和"? super ...

    jdk1.5 windows版本 64位

    标题:“jdk1.5 windows版本 64位” 描述:“jdk1.5 windows版本 64位,Java开发依赖环境” 标签:“windows” 在这个主题中,我们聚焦的是Oracle JDK 1.5(也被称为Java Development Kit,简称JDK)在Windows...

    JDK1.5的泛型实现

    以下是关于JDK 1.5泛型实现的详细解释: 1. **类型参数**:泛型的基本单位是类型参数,它在声明时用尖括号 `&lt;T&gt;` 表示,其中 `T` 是一个占位符,代表某种未知的类型。例如,在创建一个可以存储任意类型的列表时,...

    java经典教程-JDK1.5的泛型实现

    Java泛型是自JDK 1.5版本引入的一项重要特性,它极大地提高了代码的类型安全性和重用性。在本教程中,我们将深入探讨Java...通过阅读“JDK1.5的泛型实现.pdf”这份文档,你应该能更深入地理解泛型的细节和实际应用。

    linux系统jdk1.5下载

    JDK1.5引入了一些重要的特性,如增强的for循环(foreach)、匿名内部类的改进、枚举类型以及泛型的初步支持。这些特性对Java编程产生了深远影响,提升了代码的可读性和安全性。 然而,由于JDK1.5已不再受官方支持,...

    Java-jdk1.5安装包

    JDK1.5,也称为Java 5.0,是一个重要的版本,它引入了许多新的特性和改进,对Java语言的发展产生了深远影响。 一、泛型(Generics) 在Java 5.0中,最重要的特性之一就是泛型的引入。泛型允许开发者在定义类、接口...

    jdk1.5的泛型实现

    - 实现泛型接口:接口的实现类需要指定具体类型,如`class ArrayList&lt;T&gt; implements Container&lt;T&gt; {...}`。 4. 泛型通配符: - 上界通配符:如`? extends Number`,表示类型参数可以是Number或其子类。 - 下界...

    Jdk15泛型的实现

    直至JDK1.5,泛型技术终于被正式集成到Java的核心功能中,不仅编译器原生支持泛型,整个Java标准库也进行了重构以更好地兼容泛型。 #### 泛型的关键概念与实践 **参数化类型(Parameterized Types)** 参数化类型...

    JDK 1.5的泛型實現(Generics in JDK 1.5)

    今天,JDK1.5終於內建泛型特性,不僅編譯器不再需要 任何外力(外掛附件)的幫助,整個 Java標準程式庫也被翻新(retrofit),許多 角落針對泛型做了改寫。 讓我們把帶有「參數化型別」(parameterized types)的 ...

    JDK1.5,JDK1.5

    泛型是JDK1.5最重要的特性之一,它允许在类、接口和方法声明中使用类型参数,以实现数据类型的参数化。泛型提高了代码的类型安全性和可读性,减少了类型转换的需要,并允许编译器检查类型错误。 2. **自动装箱与...

    jdk1.5.exe jdk1.5

    jdk1.5.exe jdk1.5 jdk1.5下载

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    这个压缩包包含了三个不同版本的JDK:JDK 1.5、JDK 1.6和JDK 1.8,其中1.5和1.6是早期版本,而1.8是最流行且广泛使用的版本之一。 **JDK 1.5(也称为Java 5.0)** JDK 1.5在2004年发布,引入了许多重要的新特性,如...

    jdk1.5免安装版

    绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...

    JDK1.5新特性泛型_深入研究.doc

    ### JDK1.5新特性泛型深入研究 #### 一、引言 随着软件工程的发展,类型安全成为了程序设计中的一个重要考量因素。Java作为一种广泛使用的编程语言,在其发展历程中不断引入新的特性以满足日益增长的需求。JDK1.5...

Global site tag (gtag.js) - Google Analytics