黑马程序员技术交流社区

标题: 如何在cmd下输出class文件的内容?就是现实完整的字节码文... [打印本页]

作者: straw    时间: 2013-10-6 00:04
标题: 如何在cmd下输出class文件的内容?就是现实完整的字节码文...
以前好像是张老师还是方老师,不记得是谁了.在cmd下用一段命令就输出了class文件的内容,然后可以去读编译后的源代码.一般我们很少有这个需求,但通过这个方式我们可以明确的区别两个被编译后的class是否完全相同的.
哪位大神知道啊?

作者: 落木萧萧    时间: 2013-10-6 01:12
这个貌似Java没有这样的命令吧,lz可以试试jad,既有单独的exe,也有eclipse插件,比命令方便
作者: 落木萧萧    时间: 2013-10-6 01:13
或者百度反编译class文件
作者: straw    时间: 2013-10-6 11:08
落木萧萧 发表于 2013-10-6 01:12
这个貌似Java没有这样的命令吧,lz可以试试jad,既有单独的exe,也有eclipse插件,比命令方便 ...

有的编译器自带的,我当时还记下来过,后来硬盘被格式化了,就找不到了.

作者: straw    时间: 2013-10-6 11:11
落木萧萧 发表于 2013-10-6 01:13
或者百度反编译class文件

javap也可以反编译出源代码来.可是这不是我想要看的啊   我要看的是编译后的字节文件里的内容,如果你能看里面的代码就能反推出实际源代码那就NB了
作者: 落木萧萧    时间: 2013-10-6 11:43
straw 发表于 2013-10-6 11:08
有的编译器自带的,我当时还记下来过,后来硬盘被格式化了,就找不到了.

惭愧,惭愧
作者: 高亮亮    时间: 2013-10-8 15:06
难道楼主说的是Javap反编译?在doc里可以用javap反编译一个class文件,看到里面public访问权限的方法啊,静态属性啊什么的。
不知道对不对。还有个Javadoc就是根据Java源程序和说明性语句生成各种HTML文档。
不知道是不是楼主想要的答案。
作者: 黄文伯    时间: 2013-10-8 17:23
记得有软件可以打开.class文件,读取其中内容,请楼主加我QQ
作者: 黄文伯    时间: 2013-10-8 18:14
亲,请及时将"未解决"修改为"已解决"呀!
作者: straw    时间: 2013-10-8 23:38
高亮亮 发表于 2013-10-8 15:06
难道楼主说的是Javap反编译?在doc里可以用javap反编译一个class文件,看到里面public访问权限的方法啊,静 ...

我是要想看.class的源码,既不是反编译后的java源码,也不是其他说明性的文档啊.就是一个完整的.class源码
.class源码是给虚拟机识别的源码,虚拟机会有一个对应的解码器,我想在cmd下调用这个解码器去解码class文件以字符形式在控制台里输出.这样我就可以赤裸裸的看见.class的源码了.
作者: Joney__    时间: 2013-10-14 10:09
呵呵,同学这问题正好我以前老师讲过首先class文件不能用记事本打开,这里我们只能进行反编译,这样就能观看到原来代码,在反编译的时候可以输出(另存为别txt文件)方便我们观看,并可以指定保存位置。这里我忘记怎么弄了。。。。。呵呵开个玩笑,首先跟运行一样,找到运行目录,编译用javac  这里反编译用javap  反编译的是class文件,具体步骤      javap class文件名 >>out.txt    这里演示存为txt文件,希望可以对你有帮助
作者: straw    时间: 2013-10-14 22:39
Joney__ 发表于 2013-10-14 10:09
呵呵,同学这问题正好我以前老师讲过首先class文件不能用记事本打开,这里我们只能进行反编译,这样就能观 ...

恩,你确定你们老师说class不能直接输出内容么?可我见过张老师曾经演示过的啊.
这个javap好不强大啊!只能反编译出方法名和基本的算法而已,复杂点的就没辙了哦,要反编译还得考第三方工具好啊!
不过谢谢你的回答.
作者: Joney__    时间: 2013-10-15 08:46
straw 发表于 2013-10-14 22:39
恩,你确定你们老师说class不能直接输出内容么?可我见过张老师曾经演示过的啊.
这个javap好不强大啊!只能 ...

这位同学,你没有理解我的意思,我只是说class文件不能用记事本打开,打开全是乱码,这你肯定知道,按我给你发那个步骤就可以把class文件转为txt或别的文件,不用第三方软件,javap就可以,反编译后直接看class内容。
作者: Joney__    时间: 2013-10-15 08:48
straw 发表于 2013-10-14 22:39
恩,你确定你们老师说class不能直接输出内容么?可我见过张老师曾经演示过的啊.
这个javap好不强大啊!只能 ...

你按我的方法试一下就知道了,源代码什么样,反编译出来的就是什么样,你还想要什么?提醒你一下,觉得有用的在看视频中一定要做好笔记,不然光记住大概什么讲过在哪不知道,是没有的
作者: straw    时间: 2013-10-16 00:14
Joney__ 发表于 2013-10-15 08:48
你按我的方法试一下就知道了,源代码什么样,反编译出来的就是什么样,你还想要什么?提醒你一下,觉得有 ...

你说的这些方法我都知道.
下面是我输出的class文件内容格式:
  1. ObjectType:
  2. L Classname ;
  3. ArrayType:
  4. [ComponentType MethodDescriptor: ( ParameterDescriptor* ) ReturnDescriptor
  5. ParameterDescriptor: FieldType
  6. ReturnDescriptor: FieldType VoidDescriptor  VoidDescriptor:
  7. V     
复制代码
通过阅读class文件格式可以反推出java源代码,如果你够N的话,反编译工具也是通过这样实现的.
还有javassist工具也是通过class文件格式翻过来修改class文件而实现的.
我说javap功能不强大就是不能完整的反推出java源代码,下面这段是我用javap来反编译的结果:
  1. Compiled from "Open.java"
  2. public class Open {
  3.   public Open();
  4.   public static void main(java.lang.String[]);
  5. }
复制代码
其实真是的源代码是:
  1. public class Open {
  2.         public static void main(String[] ages){
  3.                 int length=ages.length;
  4.                 if(length==0){
  5.                         System.out.println("文件名不能为空");
  6.                 }else{
  7.                         if(length==1){
  8.                                 new Open().function(ages[0],"G");
  9.                         }else if(length==2){
  10.                                 new Open().function(ages[0],ages[1]);
  11.                         }else{
  12.                                 System.out.println("参数错误,请从新输入!");
  13.                         }
  14.                 }
  15.         }
  16.         //程序主功能方法
  17.         private void function(String fileStc,String encoding){
  18.                 //验证encoding参数
  19.                 if("u".equals(encoding)||"U".equals(encoding)||"G".equals(encoding)||"g".equals(encoding)||"c".equals(encoding)||"C".equals(encoding)){
  20.                         //确定编码方式
  21.                         String encodingTrue = null;
  22.                         switch(encoding.charAt(0)){
  23.                             case 'u':encodingTrue="UTF-8";break;       
  24.                             case 'U':encodingTrue="UTF-8";break;
  25.                             case 'g':encodingTrue="GBK";break;
  26.                             case 'G':encodingTrue="GBK";break;
  27.                             case 'c':encodingTrue="unicode";break;
  28.                             case 'C':encodingTrue="unicode";break;
  29.                         }
  30.                         //开始读取文件
  31.                         FileInputStream fi=null;
  32.                         try {
  33.                                 fi=new FileInputStream(fileStc);
  34.                                 byte[] b=new byte[1024];
  35.                                 int end;
  36.                                 while((end=fi.read(b))>0){
  37.                                         //输出到控制台
  38.                                         System.out.println(new String(b,0,end,encodingTrue));
  39.                                 }                               
  40.                         } catch (Exception e) {
  41.                                 e.printStackTrace();
  42.                         }finally{
  43.                                 if(fi!=null){
  44.                                         try {fi.close();} catch (IOException e) {throw new RuntimeException("读取流异常退出");
  45.                                         }
  46.                                 }
  47.                         }
  48.                 }else{
  49.                         System.out.println("未知编码"+encoding);
  50.                 }               
  51.         }
复制代码
现在你知道我想问什么了吧?还有我已经说过笔记我做过,只是后来硬盘被格式化而丢失了.呵呵...不过还是谢谢你,哥们
作者: zhou5852    时间: 2013-10-19 12:51
你要的是不是java  bin目录下的用于调试的 jdb.exe??




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2