当前位置:首页 » 编程软件 » javaenum反编译

javaenum反编译

发布时间: 2022-06-30 23:21:48

⑴ 如何反编译java字节码文件

下载jad,或者在eclipse中安装反编辑插件,建议使用eclipse

⑵ 我反编译某个java代码,得到了一个枚举 ,如何才能反推出原始的枚举是怎么写的

里面有五个枚举值:
message,notify,count,Me,comment

⑶ java反编译

如今JAVA语言在全世界范围正如火如荼般的流行,它广范地应用在INTERNET的数据库、多媒体、CGI、及动态网页的制作方面。1999年在美国对JAVA程序员的需求量首次超过C++!

作者因最近分析一些JAVA程序,对JAVA的反编译进行了一番了解,下面将我所了解的情况作以下介绍,希望对JAVA爱好者有所帮助。

JAVA是采用一种称做“字节编码”的程序结构,分为小程序(嵌入到HTML文件中)和应用程序(直接在命令状态下执行)两种类型。无论哪种结构,一旦用JAVAC 命令编译后,均变成后缀为CLASS的同名可执行文件。这种文件是不可阅读的代码。

经查阅了SUN公司的JDK(JDK1.1.3)文档资料后,我找到了一个据称是可反编译JAVA的JAVAP文件(EXE),这个文件位于\JDK\BIN\ 下面,经按说明使用后,感到失望,原来这个“反编译”仅可反编译出JAVA程序的数据区(定义)、若干方法和类的引用等。

这里我用了一个简单例子来说明问题。

JAVA的源程序hello_java.java如下:

import java.applet.*;
import java.awt.*;
public class hello_java extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello Java!\n",20,20);
}
}

经用反编译命令:javap -c -package -public -private hello_java hello.java

得到的反编译结果(hello.java)如下:(有关javap命令的选择参数请见其使用说明,这里-c表示选择了反编译)

Compiled from hello_java.java
public synchronized class hello_java extends java.applet.Applet
/* ACC_SUPER bit set */
{
public void paint(java.awt.Graphics);
public hello_java();
Method void paint(java.awt.Graphics)
0 aload_1
1 ldc #1
3 bipush 20
5 bipush 20
7 invokevirtual #6
10 return
Method hello_java()
0 aload_0
1 invokespecial #5 ()V>
4 return
}

⑷ JAVA反编译软件

由于JAVA语言安全性高、代码优化、跨平台等特性,从1995年5月由SUN公司发布后,迅速取代了很多传统高级语言,占据了企业级网络应用开发等诸多领域的霸主地位。 不过,JAVA最突出的跨平台优势使得它不能被编译成本地代码,而要以中间代码的形式运行在虚拟机环境中,这使得JAVA的反编译要比别的高级语言容易实现,并且反编译的代码经过优化后几乎可以与源代码相媲美。 为了更好地保护知识产权,避免本公司的智力成果轻易被人窃取,开发者有必要对反编译工具深入了解,以便有针对性地采取保护措施。 目前,比较流行的JAVA反编译工具有近30种,其中有三款堪称精品: 一、 应用广泛的JAD 在众多的JAVA反编译工具中,有几种非常着名的工具使用了相同的核心引擎——JAD,其中主要包括:Front End Plus、mDeJava、Decafe Pro、Cavaj Java Decompiler、DJ Java Decompiler、NMI’s Java Class Viewer和国产的JAVA源代码反编译专家。 JAD本身是一个命令行工具,没有图形界面,上述的这些工具大多是在JAD内核的基础之上加了一个图形界面而已。这么多种产品的共同选择,足可证明JAD在JAVA反编译领域中的尊贵地位。 JAD是使用Microsoft Visual C++开发的,运行速度非常快,可以处理很复杂的JAVA编译文件。众多的参数使JAD可以灵活应付多种加密手段,令反编译的代码更加优化和易读。由于JAD参数太多,没必要一一解释,其中有几个最常用的如下(以JAD 1.5.8f版本为例): -d - 用于指定输出文件的目录 -s - 输出文件扩展名(默认为: .jad),通常都会把输出文件扩展名直接指定为.java,以方便修改的重新编译。 -8 - 将Unicode字符转换为ANSI字符串,如果输出字符串是中文的话一定要加上这个参数才能正确显示。 最常用的反编译指令如下所示: Jad –d c:\javasource –s .java -8 javatest.class 这条指令将当前目录下的javatest.class反编译为javatest.java并保存在c:\javasource目录里,其中的提示输出为中文,而不是Unicode代码。 二、 源码开放的JODE JODE是全球最大的开源项目网站Sourceforge.net的成员,在所有的JAVA反编译器中,JODE的反编译效果是最好的,尤其是对付一些常见的加密手段,例如混淆技术等,更是出类拔粹。 JODE本身也是纯JAVA开发的,最近越来越多的JAVA反编译软件也选择JODE来做它们的核心引擎,例如JCavaj Java Decompiler、BTJ (Back To Java)、jEdit’s JavaInsight plugin等。 JODE是一个可运行的JAR文件,在windows环境下双击即可运行。 需要特别说明的是,JODE不是通过常规的Open->File的方式来加载JAVA编译后的类文件(*.class)或是类包(*.jar)的, 而是通过在Options菜单中的Set Classpath来实现的,单独的类文件可以将它的上一级目录作为Classpath输入,然后再选择Reload Classpath即可。 新加入的类包或是类的名字会在左侧窗口出现,双击类包名可以展开目录树结构,双击需要反编译的类名则在右上角的窗口中直接显示反编译后的源代码。 三、 独树一帜的DAVA DAVA不是一个独立的JAVA反编译器,而是JAVA代码优化工具Soot的一部分。Soot和JODE一样是纯JAVA开发的,也是一个独立的JAR包,但却不能通过双击直接运行,而是象JAD一样在命令行状态运行。 Soot对环境变量的配置要求非常严格,通常情况下要对CLASSPATH做如下设置: Set CLASSPATH=%CLASSPATH%;c:\sootdir\sootclasses-2.1.0.jar;.; 其中的c:\sootdi

⑸ Java 枚举型为什么是静态的,以及是怎么实现的

是的,Java枚举型是静态常量,隐式地用static final修饰过。

确切地说,Java枚举型是“静态常量”,这里面包含了两层意思:

枚举型中的实例隐式地用static final修饰过。
枚举型作为某个类中的成员字段也隐式地用static final修饰过。

public class Traffic{
public enum Light{GREEN,YELLOW,RED}
}

还是你上面这个代码,反编译一下,你就能看到--编译器背着你偷偷做了哪些手脚:
/*
* Decompiled with CFR 0_118.
*/
package com.ciaoshen.thinkinjava.chapter19;

public class Traffic {

public static final class Light
extends Enum<Light> {
public static final /* enum */ Light GREEN = new Light();
public static final /* enum */ Light YELLOW = new Light();
public static final /* enum */ Light RED = new Light();
private static final /* synthetic */ Light[] $VALUES;

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

public static Light valueOf(String string) {
return Enum.valueOf(Light.class, string);
}

private Light() {
super(string, n);
}

static {
$VALUES = new Light[]{GREEN, YELLOW, RED};
}
}

}

首先,枚举型Light是个实实在在的类。继承自基类Enum<Light>。然后在你不知情的情况下,偷偷加了static final修饰词。

然后三个枚举实例GREEN, YELLOW, RED也确确实实是Light的实例。然而前面也加上了static final。

然后构造器也被偷偷地阉割成private。这种实例控制手段,是不是在单例器模式里也见过?所以枚举也是实现单例器的一种方法。

然后编译器还偷偷合成了Light[]数组,一个values( )方法,一个valueOf( )方法。这个values( )在Enum的文档里都找不到。

如果在Enum里定义一个相关方法,你还会看到一个匿名内部类:
public enum Light{
GREEN{public void show(){System.out.println("Green");}},
YELLOW{public void show(){System.out.println("Yellow");}},
RED{public void show(){System.out.println("Red");}};
}

反编译的结果如下:
/*
* Decompiled with CFR 0_118.
*/
package com.ciaoshen.thinkinjava.chapter18;

import java.io.PrintStream;

public class Light
extends Enum<Light> {
public static final /* enum */ Light GREEN = new Light("GREEN", 0){

public void show() {
System.out.println("Green");
}
};
public static final /* enum */ Light YELLOW = new Light("YELLOW", 1){

public void show() {
System.out.println("Yellow");
}
};
public static final /* enum */ Light RED = new Light("RED", 2){

public void show() {
System.out.println("Red");
}
};
private static final /* synthetic */ Light[] $VALUES;

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

public static Light valueOf(String string) {
return Enum.valueOf(Light.class, string);
}

private Light() {
super(string, n);
}

static {
$VALUES = new Light[]{GREEN, YELLOW, RED};
}

}

总之,Java的Enum枚举型整个就是一个大大的“语法糖”。明明是一个完整的类,但只向用户暴露几个静态常量,隐藏掉大部分实现的细节。

⑹ java反编译工具有哪些

1、 Java反编译插件—Jadclipse
JadClipse是Jad的Eclipse插件,是一款非常实用而且方便地Java反编译插件,我们只需将下载的插件包复制到eclipse的plugins目录下,然后修改window -> Preferences -> Java -> JadClipse 下的Path to decompiler ,如:C:\pin\jadnt158\jad.exe,最后在Windows -> Perference -> General -> Editors -> File Associations中修改“*.class”默认关联的编辑器为“JadClipse Class File Viewer” 即可。
2、 Java反编译工具 —jad
jad是一款使用非常广泛地Java反编译工具,上面这款Jadclipse就是基于jad的反编译插件,JAD 文件包含 MIDlet 套件的标题信息,例如开发应用程序的公司、应用程序名称和大小。
3、 Java 反编译器—JD-GUI
JD-GUI 是一个用 C++ 开发的 Java 反编译工具,由 Pavel Kouznetsov开发,支持Windows、linux和苹果Mac Os三个平台。而且提供了Eclipse平台下的插件JD-Eclipse。JD-GUI不需要安装,直接点击运行,可以反编译jar,class文件。
4、 Java反编译器—jdec
jdec是一个Java反编译器。它能够把出现在一个.class文件中的字节码还原成Java源代码,反编译的结果几乎与原始Java文件相同。它还自带一个利用swing开发的用户操作界面。
5、 uuDeJava
uuDeJava是Java Class文件的反编译工具。反编译的Java源程序被输出到Class的相同目录。内部使用jad.exe。反编译Class文件时,可以直接点击Class文件(关联后),或者选中文件或目录发送到uuDeJava的快捷方式。还可以拖动文件或目录到uuDeJava的主窗口。
6、 Java 反向工程软件—Minjava
Minjava 是一个 Java 反向工程软件,可帮助理解已存在一些 Java 软件的架构和行为。
7、 Java Decompiler
这款反编译器叫 “Java Decompiler”, 由 Pavel Kouznetsov开发,目前最新版本为0.2.5. 它由 C++开发,并且官方可以下载 windows、linux和苹果Mac Os三个平台的可执行程序。
参考资料:http://www.kiwisec.com/news/detail/592e90c09a3e7a3fddc62db7.shtml

⑺ 如何将java中的.class文件反编译

安装Java jdk后
看安装目录里有没有jad.exe,没有要下载,一般都有的
配置Java环境变量
开始-运行-cmd-回车-进入命令行窗口:
cd+空格+class文件所在路径:
按下面的命令进行反编译:
例如:[2] jad -sjava example.class 回车
在目录里可以看到example.java源文件

[1] 反编译一个class文件:jad example.class,会生成example.jad,用文本编辑器打开就是java源代码
[2] 指定生成源代码的后缀名:jad -sjava example.class,生成example.java
[3] 改变生成的源代码的名称,可以先使用-p将反编译后的源代码输出到控制台窗口,然后使用重定向,输出到文件:jad -p example.class > myexample.java
[4] 把源代码文件输出到指定的目录:jad -dnewdir -sjava example.class,在newdir目录下生成example.java
[5] 把packages目录下的class文件全部反编译:jad -sjava packages/*.class
[6] 把packages目录以及子目录下的文件全部反编译:jad -sjava packages/**/*.class,不过你仍然会发现所有的源代码文件被放到了同一个文件中,没有按照class文件的包路径建立起路径
[7] 把packages目录以及子目录下的文件全部反编译并建立和java包一致的文件夹路径,可以使用-r命令:jad -r -sjava packages/**/*.class
[8] 当重复使用命令反编译时,Jad会提示“whether you want to overwrite it or not”,使用-o可以强制覆盖旧文件

[9] 还有其他的参数可以设置生成的源代码的格式,可以输入jad命令查看帮助,这里有个人做了简单的翻译:jad命令总结
[10] 当然,你会发现有些源文件头部有些注释信息,不用找了,jad没有参数可以去掉它,用别的办法吧。

热点内容
酒店的路由器如何配置 发布:2024-05-19 15:10:44 浏览:499
rpgmaker脚本 发布:2024-05-19 14:48:58 浏览:406
hds存储虚拟化 发布:2024-05-19 14:47:09 浏览:20
mysql数据库分片 发布:2024-05-19 14:42:30 浏览:341
2021款魏派vv6买哪个配置 发布:2024-05-19 14:31:11 浏览:632
前端如何打开第二个服务器地址 发布:2024-05-19 14:30:55 浏览:569
新建文件夹2百度盘 发布:2024-05-19 14:24:07 浏览:607
waslinux安装部署 发布:2024-05-19 14:23:11 浏览:786
安卓系统怎么注册不了ins 发布:2024-05-19 14:01:00 浏览:961
买服务器后怎么搭建功能 发布:2024-05-19 14:00:03 浏览:208