说明:下面的反编译结果使用“ http://download.csdn.net/detail/wangshuxuncom/6841823”处的反编译工具反编译的。

一、不含有抽象的方法

源码如下:

import java.util.Arrays;
import java.util.List;public enum Weather {Sunny(1, "晴天"), Rainy(2, "雨天"), Cloudy(3, "多云");private int value;private String label;private Weather(int value, String label) {this.value = value;this.label = label;}public int getValue() {return value;}public String getLabel() {return label;}public static Weather parse(int value) {Weather result = Weather.Sunny;switch (value) {case 1:result = Weather.Sunny;break;case 2:result = Weather.Rainy;break;case 3:result = Weather.Cloudy;break;}return result;}public static List<Weather> getEnumValues() {return Arrays.asList(values());}public static void main(String[] args) {System.out.println(Weather.Sunny.getValue() + ":" + Weather.Sunny.getLabel());Weather weather = Weather.Cloudy;System.out.println(weather.getValue() + ":" + weather.getLabel());List<Weather> list = getEnumValues();for (Weather sw : list) {System.out.println(sw.value + "--" + sw.label);}}
}

反编译生成的class文件后的代码如下:

/*import java.io.PrintStream;*/
import java.util.*;public final class Weather extends Enum{private Weather(/*String s, int i,*/ int value, String label){/*super(s, i);*/this.value = value;this.label = label;}public int getValue(){return value;}public String getLabel(){return label;}public static Weather parse(int value){Weather result = Sunny;switch(value){case 1: /*// '\001'*/result = Sunny;break;case 2: /*// '\002'*/result = Rainy;break;case 3: /*// '\003'*/result = Cloudy;break;}return result;}public static List getEnumValues(){return Arrays.asList(values());}public static void main(String args[]){System.out.println((new StringBuilder(String.valueOf(Sunny.getValue()))).append(":").append(Sunny.getLabel()).toString());Weather weather = Cloudy;System.out.println((new StringBuilder(String.valueOf(weather.getValue()))).append(":").append(weather.getLabel()).toString());List list = getEnumValues();Weather sw;for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println((new StringBuilder(String.valueOf(sw.value))).append("--").append(sw.label).toString()))sw = (Weather)iterator.next();}/*public static Weather[] values(){Weather aweather[];int i;Weather aweather1[];System.arraycopy(aweather = ENUM$VALUES, 0, aweather1 = new Weather[i = aweather.length], 0, i);return aweather1;}*//*public static Weather valueOf(String s){return (Weather)Enum.valueOf(Weather, s);}*//*public static final Weather*/ Sunny;/*public static final Weather*/ Rainy;/*public static final Weather*/ Cloudy;private int value;private String label;/*private static final Weather ENUM$VALUES[];*/static {Sunny = new Weather(/*"Sunny", 0,*/ 1, "\u6674\u5929");Rainy = new Weather(/*"Rainy", 1,*/ 2, "\u96E8\u5929");Cloudy = new Weather(/*"Cloudy", 2,*/ 3, "\u591A\u4E91");/*ENUM$VALUES = (new Weather[] {Sunny, Rainy, Cloudy});*/}
}

注意:所有/**/中间的东西都是多余的(/**/是人为添加的)

如何将反编译代码还原:

①、去掉被/**/掉的代码,去掉后代码如下:

import java.util.*;public final class Weather extends Enum{private Weather(int value, String label){this.value = value;this.label = label;}public int getValue(){return value;}public String getLabel(){return label;}public static Weather parse(int value){Weather result = Sunny;switch(value){case 1:result = Sunny;break;case 2:result = Rainy;break;case 3:result = Cloudy;break;}return result;}public static List getEnumValues(){return Arrays.asList(values());}public static void main(String args[]){System.out.println((new StringBuilder(String.valueOf(Sunny.getValue()))).append(":").append(Sunny.getLabel()).toString());Weather weather = Cloudy;System.out.println((new StringBuilder(String.valueOf(weather.getValue()))).append(":").append(weather.getLabel()).toString());List list = getEnumValues();Weather sw;for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println((new StringBuilder(String.valueOf(sw.value))).append("--").append(sw.label).toString()))sw = (Weather)iterator.next();}Sunny;Rainy;Cloudy;private int value;private String label;static {Sunny = new Weather(1, "\u6674\u5929");Rainy = new Weather(2, "\u96E8\u5929");Cloudy = new Weather(3, "\u591A\u4E91");}
}

②、在上一步的基础上对照非反编译中的java源码可以还原大概,呵呵呵,可能你会说“狗屁,我要是知道源码了,还反编译干什么”,呵呵呵,别急,如果你能把上面的这个弄明白了,你就会反编译没有源码参考的枚举类了。

③、呵呵呵,本来到此就可以了事了,可是还是禁不住提几个地方:注意反编译前java文件和反编译后生成的java文件在引类的区别;注意反编译class文件后的泛型没有了;从反编译的结果中可以得出这样的结论:实际上枚举类型就是以Java类来实现的,没有什么新的特点,只不过java编译器帮我们做了语法的解析和编译。

二、含有抽象的方法

源码如下:

import java.util.Arrays;
import java.util.List;public enum Weather {Sunny(1, "晴天") {@Overridepublic String test() {return "今天阳光明媚!!!\n";}},Rainy(2, "雨天") {@Overridepublic String test() {return "出门别忘带把雨伞哦!!!\n";}},Cloudy(3, "多云") {@Overridepublic String test() {return "别出去登高望远了,你看不远的,呵呵呵!!!\n";}};private int value;private String label;private Weather(int value, String label) {this.value = value;this.label = label;}public int getValue() {return value;}public String getLabel() {return label;}public abstract String test();public static Weather parse(int value) {Weather result = Weather.Sunny;switch (value) {case 1:result = Weather.Sunny;break;case 2:result = Weather.Rainy;break;case 3:result = Weather.Cloudy;break;}return result;}public static List<Weather> getEnumValues() {return Arrays.asList(values());}public static void main(String[] args) {System.out.println(Weather.Sunny.getValue() + ":" + Weather.Sunny.getLabel());Weather weather = Weather.Cloudy;System.out.println(weather.getValue() + ":" + weather.getLabel() + "\n\n");List<Weather> list = getEnumValues();for (Weather sw : list) {System.out.println(sw.value + "--" + sw.label + "--" + sw.test());}}
}

反编译生成的class文件后的代码如下:

import java.io.PrintStream;
import java.util.*;public abstract class Weather extends Enum {private Weather(String s, int i, int value, String label) {super(s, i);this.value = value;this.label = label;}public int getValue() {return value;}public String getLabel() {return label;}public abstract String test();public static Weather parse(int value) {Weather result = Sunny;switch (value) {case 1: // '\001'result = Sunny;break;case 2: // '\002'result = Rainy;break;case 3: // '\003'result = Cloudy;break;}return result;}public static List getEnumValues() {return Arrays.asList(values());}public static void main(String args[]) {System.out.println((new StringBuilder(String.valueOf(Sunny.getValue()))).append(":").append(Sunny.getLabel()).toString());Weather weather = Cloudy;System.out.println((new StringBuilder(String.valueOf(weather.getValue()))).append(":").append(weather.getLabel()).append("\n\n").toString());List list = getEnumValues();Weather sw;for (Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println((new StringBuilder(String.valueOf(sw.value))).append("--").append(sw.label).append("--").append(sw.test()).toString()))sw = (Weather) iterator.next();}public static Weather[] values() {Weather aweather[];int i;Weather aweather1[];System.arraycopy(aweather = ENUM$VALUES, 0, aweather1 = new Weather[i = aweather.length], 0, i);return aweather1;}public static Weather valueOf(String s) {return (Weather) Enum.valueOf(Weather, s);}Weather(String s, int i, int j, String s1, Weather weather) {this(s, i, j, s1);}public static final Weather Sunny;public static final Weather Rainy;public static final Weather Cloudy;private int value;private String label;private static final Weather ENUM$VALUES[];static {Sunny = new Weather("Sunny", 0, 1, "\u6674\u5929") {public String test() {return "\u4ECA\u5929\u9633\u5149\u660E\u5A9A\uFF01\uFF01\uFF01\n";}};Rainy = new Weather("Rainy", 1, 2, "\u96E8\u5929") {public String test() {return "\u51FA\u95E8\u522B\u5FD8\u5E26\u628A\u96E8\u4F1E\u54E6\uFF01\uFF01\uFF01\n";}};Cloudy = new Weather("Cloudy", 2, 3, "\u591A\u4E91") {public String test() {return "\u522B\u51FA\u53BB\u767B\u9AD8\u671B\u8FDC\u4E86\uFF0C\u4F60\u770B\u4E0D\u8FDC\u7684\uFF0C\u5475\u5475\u5475\uFF01\uFF01\uFF01\n";}};ENUM$VALUES = (new Weather[] { Sunny, Rainy, Cloudy });}
}

总结:对比源代码和编译代码,找出他们的区别并不难,做到这一点就可以反编译含有抽象方法的枚举class文件,呵呵呵呵,将“不含抽象方法”的class反编译文件和“含有抽象方法”的class反编译文件,你应该还有一个很大的收获,呵呵呵,看着:

“不含抽象方法”的class反编译文件:public final class Weather extends Enum

“含有抽象方法”的class反编译文件:public abstractclass Weather extends Enum

反编译那些事儿(二)—枚举的反编译相关推荐

  1. 【Groovy】编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )

    文章目录 一.编译时元编程引入 二.声明需要编译时处理的类 三.分析 Groovy 类的 AST 语法树 一.编译时元编程引入 在之前的 " [Groovy]MOP 元对象协议与元编程 &q ...

  2. Java代码的编译与反编译那些事儿

    GitHub 2.5k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 2.5k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 2.5k Star 的 ...

  3. 【Java 虚拟机原理】Dalvik 虚拟机 ( 打包 Jar 文件和 Dex 文件 | 反编译 Dex 文件 | 分析 Dex 文件反编译结果 )

    文章目录 前言 一.打包 Jar 文件和 Dex 文件 1.示例代码 2.打包 Jar 文件 3.打包 Dex 文件 二.反编译 Dex 文件 三.分析 Dex 文件 1.Student 类相关信息 ...

  4. ubuntu java反编译,[原创]Ubuntu下简单配置反编译工具以及其开发环境

    0x0:前言 个人电脑重新换了下系统,Ubuntu14.04,刚好需要配置下android的反编译环境,这里简单记录一下,以供有需要的朋友参考. 其实最简单的,只需要apktool就可以了,不过有编码 ...

  5. 二维离散余弦变换(DCT)与二维离散反余弦变换(IDCT)C语言实现

    二维离散余弦变换(DCT)与二维离散反余弦变换(IDCT)C语言实现 实验目标 对一个8x8的矩阵进行DCT和IDCT然后在观察前者和后者的变化 实验准备 理论基础 二维离散余弦变换 F ( u , ...

  6. 互联网反欺诈体系之二

    1 互联网反欺诈的不对称性 不夸张的讲,欺诈者对于技术的运用能力.对于业务的熟悉程度和对于目标的执着要远超过甲方互联网反欺诈的从业人员.造成这种局面主要有几个原因: 欺诈者仅需要在企业的互联网反欺诈体 ...

  7. android 常用编译工具,Android 抖音常用反编译工具

    Android 抖音常用反编译工具 常用反编译工具 apktool :反编译apk,重构. dex2jar :反编译apk,解压 classes.dex 文件 JD-GUI :将class文件反编译成 ...

  8. x264代码剖析(二):如何编译运行x264以及x264代码基本框架

    x264代码剖析(二):如何编译运行x264以及x264代码基本框架 x264工程在x265出现之前一直在更新,但是自x264-20091007(含)不再支持VC++平台,也就是说支持VC++平台的x ...

  9. python爬虫反爬 css 知乎 专栏_反反爬虫系列(四)

    过完年,好了,咱们接着更新反反爬虫系列 至于之前有朋友表示出一下1688呀,x宝的反反爬虫 说实在的,阿里系的反爬虫很厉害,我自愧不能搞定. 比如x宝的登录,用了selenium + chrome的朋 ...

  10. linux中特殊字符反引号,linux中的特殊符号$ ‘’ 反引号 反斜杠

    写在前面:Shell中的特殊字符有 $ 美元符 \ 反斜杠 ` 反引号 "双引号 < ,>;,*,?,[,] 1.反引号``:命令替换 在输出一句话的时候,如果想中间加入命令输出 ...

最新文章

  1. github开源项目分享
  2. fastqc检验时不能执行java_利用fastqc检测原始序列的质量
  3. docker安装gamit_科学网—Ubuntu系统GAMIT/GLOBK程序安装 - 陈超的博文
  4. 33 -jQuery 属性操作,文档操作(未完成)
  5. linux防火墙停用,关闭LINUX防火墙
  6. Caffe源码解析2:SycedMem
  7. 在python中求小于100的所有合数_python输出100以内的质数与合数
  8. Js获取当前日期时间及其它操作(转)
  9. 蓝桥杯 ADV-69 算法提高 质因数
  10. h5页面如何切图_切图与CSS入门
  11. CSS绝对定位absolute详解
  12. 那些年我们错过的大话西游!!!
  13. CityEngine + Python自动化建模原理【系列文章之三】
  14. 32位低功耗MCU的设计
  15. linux 免费教程下载,Linux系统入门教程
  16. eclipes工具介绍及下载安装汉化
  17. 鸿蒙归蝶的反弹,副本攻略-鸿蒙试炼
  18. Zabbix监控学习系列(2):agent的安装与Server端添加客户端
  19. C++积累02_隔定时长放炮问题的OOP解决
  20. 传华硕将在6月3日闪现EBox台式电脑

热门文章

  1. 精装友好联络算法实现借壳和RI
  2. [Kali_Nethunter] Kali 推出Android端渗透测试系统Nethunter
  3. C# WebBrowser控件使用整理
  4. Tomcat性能调优方案
  5. 如何用hover实现下拉菜单
  6. 5.数据中台 --- 数据汇聚联通:打破企业数据孤岛
  7. 47.Linux/Unix 系统编程手册(下) -- System V 信号量
  8. 41. PHP MySQL 连接数据库
  9. 5. laravel 路由(2)
  10. php中is_scalar判断是否是标量