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

再次证明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,JDK1.5

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

    jdk1.5的泛型实现

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

    IBM_jdk1.5_Guide.zip_IBM jdk 1.5_aix_ibm java1.5_ibm jdk1.5 wind

    在"IBM_jdk1.5_Guide.pdf"这个文档中,很可能是IBM JDK 1.5的官方指南或开发者手册,它将详细阐述如何安装、配置和使用IBM JDK 1.5,以及如何在AIX环境下进行Java开发。而"www.pudn.com.txt"可能是下载资源的来源...

    Jdk15泛型的实现

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

    jdk1.5 windows 64位官方正式版

    10. **NIO.2(New I/O API)**:虽然JDK 1.5中并未完全实现,但为后续版本的NIO.2打下了基础,增加了对文件系统操作的丰富API。 **对于Windows 64位系统的重要性:** 随着64位计算平台的普及,JDK 1.5的64位版本...

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

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

    JDK1.5的32位和64位安装包

    首先,JDK1.5最重要的特性之一是泛型(Generics)。泛型允许在类、接口和方法中使用类型参数,从而提高了代码的类型安全性和可读性。通过泛型,开发者可以限制容器只能存储特定类型的对象,避免了强制类型转换,减少...

    jdk1.5.zip 免费分享,哈哈

    Java Development Kit(JDK)是Java编程语言的核心组件,它包含了一个Java编译器、Java运行时环境(JRE)、调试工具和其他必要...因此,这个压缩包中的"jdk1.5.exe"可能是开发者为了兼容性或历史项目而寻找的重要资源。

Global site tag (gtag.js) - Google Analytics