`

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 类型应用比较少,只是在看文章的时候了解了一些,所以记录下,在项目中有助于以后的深入应用。

分享到:
评论

相关推荐

    Enum的用法

    3. **内置接口实现**:`Enum`类型默认实现了`java.lang.Comparable`接口,这意味着枚举值之间可以进行比较,为排序和比较操作提供了便利。 4. **方法覆盖与重写**:`Enum`覆载了`toString()`方法,允许枚举值以字符...

    Filter_Enum.rar_enum.filter

    直接解析可能涉及读取注册表中的DirectShow滤波器注册信息,或者直接与过滤器的内部接口交互,以获取更深层次的元数据。这种方法对于调试、分析系统性能或者开发自定义过滤器的开发者尤其有用。 此外,这种全面的...

    Java中的Enum的使用与分析

    通过理解枚举类型的内部实现和高级用法,开发者可以更有效地利用这一特性,提高代码质量和可维护性。枚举不仅限于简单的一组常量,还可以包含复杂的数据和逻辑,这使得它们在各种场景下都能发挥重要作用。

    CHM文件解析浏览程序

    在"CHM文件解析浏览程序"中,描述提到了"无第三方类库",这意味着这个源码实现完全独立,不依赖于外部的库或API,而是通过内置的解析机制来处理CHM文件。这可能涉及到对CHM文件结构的深入理解和自定义编码。 CHM...

    内部类和枚举类.rar

    - `demo7`可能是一个综合示例,结合了内部类和枚举类,比如定义一个枚举作为内部类,或者在枚举类中使用内部类来实现特定逻辑。 通过分析这些示例,你可以更直观地理解内部类和枚举类在实际开发中的应用。在阅读和...

    在Rust中编写JavaScript解析器的教程.zip

    可以使用递归下降解析或LR/LALR解析技术来实现。在Rust中,递归下降解析相对简单,易于理解和实现,但可能无法处理所有复杂的文法结构。 **抽象语法树(AST)** AST是程序源代码的结构化表示,每个节点代表代码的一...

    常见设计模式的解析和实现(C++)之十五

    enum class SingletonEnum { INSTANCE, }; static Singleton& getInstance() { return SingletonEnum::INSTANCE; } // ... }; ``` 枚举类的实例在编译时创建,因此确保了线程安全且生命周期与程序相同。 ...

    解析STM32库函数

    这一库不仅简化了硬件接口的操作,还极大地提高了开发效率,使得开发者能够专注于应用逻辑的设计与实现。 #### 二、STM32标准库简介 STM32标准库是一套用于STM32微控制器系列的固件开发包,它包括了一系列预定义的...

    c语言期末考试题和答案解析.pdf

    - **解析**: 由于`fact()`函数没有实现递归逻辑,该部分代码仅展示了如何调用`fact()`,实际输出结果取决于`fact()`函数的具体实现。 以上就是针对给定文件中的C语言期末考试题目和答案解析的详细知识点总结。

    chmlib-0.40 chm格式解析工具

    CHM文件内部采用类似数据库的结构,通过索引和块数据的方式组织内容,便于快速访问。 **二、chmlib工具介绍** `chmlib`是一款开源的CHM格式解析库,用于读取和处理CHM文件内容。它为开发者提供了API接口,可以在...

    Java实现单例设计模式方法解析

    Java实现单例设计模式方法解析 单例设计模式是软件设计模式中的一种,旨在确保一个类只有一个实例,并提供一个全局访问点。Java中有多种方式可以实现单例设计模式,本文将对这些方法进行解析,并提供示例代码。 一...

    java单例五种实现模式解析

    3. **静态内部类实现模式**: 这种方式结合了饿汉式的线程安全和延迟加载的优点。静态内部类不会在主类加载时立即加载,只有当调用`getInstance()`方法时才会加载,因此实现了延迟加载。同时,由于类加载机制,它是...

    Kinect开发骨骼识别,元部件说明

    通过对这些编码的解析,Kinect能够理解用户的动作并作出相应的响应。 ##### 2. 动作识别与触发 - **动作识别**:Kinect通过捕捉用户的动作并将其与内部存储的人体模型进行比较来识别特定的动作。 - **动作触发**:...

    解析STM32的库函数

    本节将以STM32的标准固件库中的GPIO(General-Purpose Input/Output,通用输入/输出端口)初始化为例,深入解析库函数的内部结构及其使用方法。 ##### 1. GPIO初始化结构体 在STM32的标准固件库中,`GPIO_...

    c语言实现的象棋源码.zip

    《C语言实现的象棋源码解析》 在编程领域,C语言以其高效、灵活的特点,被广泛应用于系统开发、游戏编程以及各种嵌入式系统。本篇文章将深入探讨一个用C语言实现的象棋程序,通过源码分析,帮助读者理解C语言编程...

    matlab开发-toycompiler

    9. **enum.m** - 枚举(enum)文件可能用于定义语言中的枚举类型或者在解析和生成过程中使用的状态枚举。 整个“ToyCompiler”项目提供了从源代码到可执行代码的完整编译流程,包括词法分析、语法解析、语义分析和...

    解析器:根据一组规则解析网址

    Elixir提供了诸如Regex、String、Enum等模块,帮助开发者进行文本操作和解析。此外,Elixir的元编程特性允许我们在运行时构建解析规则,极大地提高了代码的灵活性。 提到标签"mix",它是Elixir项目的标准构建工具,...

    从java到C解析Binder机制

    这个类提供了注册服务、查询服务信息等功能,其内部定义了一个enum枚举,包含四个常量,分别对应不同的服务管理操作。这些常量的值与`ServiceManager`(service_manager.c)中的enum常量相对应,确保了Java层与C层...

    MFC实现C语言词法分析

    这个文件可能是实现词法分析的源代码文件,包含处理文件、解析字符、生成标记和错误处理的相关函数和类。通过阅读和理解这个文件,可以进一步了解MFC如何与词法分析算法相结合。 6. **测试与调试**: 实现词法...

Global site tag (gtag.js) - Google Analytics