`

enum 内部实现解析

阅读更多

  简单写个Enum 类型,然后反编译下

 

/**
 * 
 * @author zhxing
 * @since 2010.02.26
 */
public enum Test{	
	//这定义必须放在第一行,否则会报错
	Spring("a"),Summer("b",1),Autumn("c"),Winter("d");
	//类变量
	public static int staticValue=10;
	//类实例变量
	private  String s;
	private  int value;
	//构造方法
	Test(String s){
		this.s=s;
	}
	Test(String s,int value){
		this.s=s;
		this.value=value;
	}
	//其他方法
	public int getValue() {
		return value;
	}
	public static void main(String[] args) {
		System.out.println(Test.valueOf("Spring"));
		System.out.println(Test.Spring.s);
	}
}

 

 

 反编译后的源码为:

 

// Decompiled by DJ v3.9.9.91 Copyright 2005 Atanas Neshkov  Date: 2010-2-26 16:07:52
// Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
// Decompiler options: packimports(3) 
// Source File Name:   Test.java

import java.io.PrintStream;

public final class Test extends Enum
{

    public static Test[] values()
    {
        return (Test[])$VALUES.clone();
    }

    public static Test valueOf(String s1)
    {
        return (Test)Enum.valueOf(Test, s1);
    }

    private Test(String s1, int i, String s2)
    {
        super(s1, i);
        s = s2;
    }

    private Test(String s1, int i, String s2, int j)
    {
        super(s1, i);
        s = s2;
        value = j;
    }

    public int getValue()
    {
        return value;
    }

    public static void main(String args[])
    {
        System.out.println(valueOf("Spring"));
        System.out.println(Spring.s);
    }

    public static final Test Spring;
    public static final Test Summer;
    public static final Test Autumn;
    public static final Test Winter;
    public static int staticValue = 10;
    private String s;
    private int value;
    private static final Test $VALUES[];

    static 
    {
        Spring = new Test("Spring", 0, "a");
        Summer = new Test("Summer", 1, "b", 1);
        Autumn = new Test("Autumn", 2, "c");
        Winter = new Test("Winter", 3, "d");
        $VALUES = (new Test[] {
            Spring, Summer, Autumn, Winter
        });
    }
}

 

  看了反编译的源码后,应该知道大概了吧。。在java1.5 时加入的很多特性,其实都是在编译时期加的,在JVM内部实现是没有变的,例如泛型也是这样的,有兴趣的可以自己反编译下泛型的实现,不过泛型的实现确实在编译时期操作比较复杂,在thinking in java 里有讲解到。总体来说,对于我而已,对enum 类型应用比较少,只是在看文章的时候了解了一些,所以记录下,在项目中有助于以后的深入应用。

分享到:
评论

相关推荐

    compiler:抽象语法树

    一个表达式解析器、词法分析器,最终是一个解释器,它实现了一个抽象语法树,用于以整数文字或变量标识符作为其操作数的二进制表达式的链式变量赋值。 当前,当遍历 AST 时,所有变量标识符都将返回 0。 表达式从...

    vc++ 应用源码包_1

    内部包含多种实例实现MP3解码,有开发文档。 MP3解压程序源代码 MPEG4播放器源代码 MSN 仿真界面全部源代码 如题,非常好的界面设计实例,自绘控件的实现。 Mufan MP3播放的实现。 MYICQ 0.8 alpha1 (仿腾讯QQ...

    vc++ 应用源码包_2

    内部包含多种实例实现MP3解码,有开发文档。 MP3解压程序源代码 MPEG4播放器源代码 MSN 仿真界面全部源代码 如题,非常好的界面设计实例,自绘控件的实现。 Mufan MP3播放的实现。 MYICQ 0.8 alpha1 (仿腾讯QQ...

    vc++ 应用源码包_6

    内部包含多种实例实现MP3解码,有开发文档。 MP3解压程序源代码 MPEG4播放器源代码 MSN 仿真界面全部源代码 如题,非常好的界面设计实例,自绘控件的实现。 Mufan MP3播放的实现。 MYICQ 0.8 alpha1 (仿腾讯QQ...

    vc++ 应用源码包_5

    内部包含多种实例实现MP3解码,有开发文档。 MP3解压程序源代码 MPEG4播放器源代码 MSN 仿真界面全部源代码 如题,非常好的界面设计实例,自绘控件的实现。 Mufan MP3播放的实现。 MYICQ 0.8 alpha1 (仿腾讯QQ...

    vc++ 应用源码包_3

    内部包含多种实例实现MP3解码,有开发文档。 MP3解压程序源代码 MPEG4播放器源代码 MSN 仿真界面全部源代码 如题,非常好的界面设计实例,自绘控件的实现。 Mufan MP3播放的实现。 MYICQ 0.8 alpha1 (仿腾讯QQ...

    vc++ 开发实例源码包

    内部包含多种实例实现MP3解码,有开发文档。 MP3解压程序源代码 如题。 MPEG4播放器源代码 如题。 MSN 仿真界面全部源代码 如题,非常好的界面设计实例,自绘控件的实现。 Mufan MP3播放的实现。 MYICQ 0.8 ...

    【C++】多文件程序结构.pdf

    具有内部链接性的: · 所有的声明 · 命名空间(包括全局命名空间)中的静态⾃由函数、静态友元函数、静态变量的定义、const常量定义 · enum定义 · inline函数定义(包括⾃由函数和⾮⾃由函数) · 类(class、struct...

    Java开发技术大全 电子版

    11.2.8枚举(Enum)使用示例355 11.2.9枚举集(EnumSet)使用示例358 11.3常用算法361 11.3.1Collections中的简单算法361 11.3.2排序362 11.3.3二分查找364 11.4遗留的类和接口366 11.4.1Enumeration接口简介...

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    对于Service类,内部的实现类加Impl的后缀与接口区别。例如:ProductServiceImpl实现ProductService接口。 C .对于Service类,基于SOA的理念,是以接口方式暴露服务。 D .尽量不在接口里定义变量,如果一定要...

    day020-继承加强和设计模式代码和笔记.rar

    4. Properties资源(配置)文件的解析(重点) ---------------------------------(注意:重点)------------------------------------- 以后配置文件都要放到项目中的一个或者几个单独的文件夹中,为了好管理...

    一些C面试题,希望能对大家有帮助

    只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件 static全局...

    你必须知道的495个C语言问题

    4.7 我有些解析外部结构的代码,但是它却崩溃了,显示出了“unalignedaccess”(未对齐的访问)的信息。这是什么意思? 作为函数参数的指针 4.8 我有个函数,它应该接受并初始化一个指针:voidf(int*ip){...

    《你必须知道的495个C语言问题》

    4.7 我有些解析外部结构的代码,但是它却崩溃了,显示出了“unaligned access”(未对齐的访问)的信息。这是什么意思? 47 作为函数参数的指针 47 4.8 我有个函数,它应该接受并初始化一个指针:void f(int *ip)...

Global site tag (gtag.js) - Google Analytics