在java中,如果在一个类中定义了内部类,刚会生成: super&this.class的文件,如果给某个控件添加了Listener事件,则会生成 super&i.class的文件,其中i为Listener的个数。 例如:下面的程序: import javax.swing.*; import java.awt.*; import java.awt.event.*; /** *
Title:
*
Description:
*
Copyright: Copyright (c) 2001
*
Company:
* @author unascribed * @version 1.0 */ public class a extends JFrame { JPanel jPanel1 = new JPanel(); JButton jButton1 = new JButton(); JButton jButton2 = new JButton(); JButton jButton3 = new JButton(); public a() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { jButton1.setText("jButton1"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { jButton1_actionPerformed(e); } }); jButton2.setText("jButton2"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { jButton2_actionPerformed(e); } }); jButton3.setText("jButton3"); jButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { jButton3_actionPerformed(e); } }); this.getContentPane().add(jPanel1, BorderLayout.CENTER); jPanel1.add(jButton1, null); jPanel1.add(jButton2, null); jPanel1.add(jButton3, null); } void jButton1_actionPerformed(ActionEvent e) { } void jButton2_actionPerformed(ActionEvent e) { } void jButton3_actionPerformed(ActionEvent e) { } class b{ } class c{ class c1{} } } 编译后生成的class文件有: a.class a$1.class //jButton1.addActionListener a$2.class //jButton2.addActionListener a$3.class //jButton3.addActionListener a$b.class a$c.class a$c1.class 但如果a.java这样定义: class a{ } class b{ } 注意为同一个文件: 刚编译后生成b.class,a.class 而不是a$b.class 2 beyond compare来比较两种方式的编译结果,发现多出的两个类是GameClient$1.Class和GameBoard$1.Class。反编译其中的GameClient$1.Class,得到如下结果(另一个除包名外与此相同): // Decompiled by DJ v 2.8.8 .54 Copyright 2000 Atanas Neshkov Date: 2005-1-24 17:22:29 // Home Page : http://members.fortunecity.com/neshkov/dj.html - Check often for new version! // Decompiler options: packimports(3) // Source File Name: GameClient.java package xxx.xxx.xxx.xxx; (此处隐去相关信息) static class { } 从这个代码来看,程序中好像有匿名类的使用,但查看程序的源代码,却找不到。那么这两个类究竟是怎么产生的呢,javac编译时究竟发生了什么呢? 经过一番调查,终于定位了匿名类是如何产生的。让我们先来看看下面的代码: public class OuterClass { private InnerClass test = new InnerClass(); private class InnerClass { } } 你期望的编译结果可能是产生下面两个类文件: OuterClass.class OuterClass$InnerClass.class 而实际javac编译的结果类文件却是: OuterClass.class OuterClass$InnerClass.class OuterClass$1.class 多出了OuterClass$1.class,这是因为: 当内部类是私有的且没有明确书写公有的构造函数时,那么缺省构造函数就是私有的,javac(SUN JDK 1.4)对这种情况的处理就是创建一个可以访问的带有一个参数的构造函数,而这个参数的类型是一个匿名的静态类,所以编译时就会多生成一个class文件。 你可能使用Eclipse进行编译,那么是的,结果跟你期望的一致,没有OuterClass$1.class。这是为什么?Eclipse JDT使用的编译器与JDK提供的javac不一样?是的,Eclipse JDT使用的是它自己内建的编译器,有一些增强的功能,包括对上述情况的完美处理。 终于明白了问题的根源在于,GameClient.java,GameBoard.java中分别有一个私有内部类没有定义构造函数。 那么至此,这个问题给我们带来的启示是: 1、 确认项目最终使用的Java类的编译器。如果可能,尽可能使用javac生成结果应用程序,或是与客户达成一致。 2、 尽量明确的书写缺省构造函数及其可见性,如将上面的代码改为: public class OuterClass { private InnerClass test = new InnerClass(); private class InnerClass { public InnerClass() { } } } 3 对于引用中的interface--impl 在实现类中没有缺省的构造函数,在调用的同时,就会产生额外的文件
分享到:
相关推荐
1、打开一个或者多个*.class文件,XJad反编译后,重命名为*.java文件, 保存至当前文件夹,并在编辑器中打开查看; 2、打开一个文件夹,XJad将该文件夹下所有*.class文件进行反编译,并保存至该文件夹下, 依据包...
java反编译工具(.class文件反编译成.java文件) 解压后点击exe文件打开工具,点击open菜单选择.class文件执行后即生成.java文件 一直在使用的,方便,系统维护必不可少
java反编译软件,可以将编译后的class文件反编译成java文件
JAVA反编译软件(可将class文件反编译为java文件)
java class文件编译,可查看编译文件。
将.class文件反编译为.java文件,可以实现将别人的文件反编译后查看里面的代码。
java反编译项目工程,可以将class 文件 进行 修改 重新导包 生成修改后的jar 步骤 1、将需要修改的 jar 包 放入 lib 目录下,并加入项目中 ,选中 jar 右击 选择 add a libray这个时候会看到 jar 的 目录 结构 2、...
java反编译工具反编译.class文件 java反编译工具反编译.class文件java反编译工具反编译.class文件java反编译工具反编译.class文件java反编译工具反编译.class文件
很小巧的javaclass反编译工具 只需要把点击exe文件执行 然后点击打开想要反编译的class文件 在对应的目录下就会生成.java的javabean文件 非常好用
class文件反编译工具,直接打开class文件,不用ide,方便快捷好用!
Java class 文件反编译工具Java class 文件反编译工具
编译Java源文件的工具 编译.class文件
应用于class、java等各种文件的反编译操作,文件小巧易用
java反编译 java工具 class文件
经测试可使用的反编译工具,将.class反编译成.java文件,使用起来非常方便
class编译 编译 JAVA代码 class破解 class class编译成JAVA文件 可以把别人的class文件弄成java文件
java的反编译工具,我已经用了五年,感觉十分好用。现在分享给大家
查看java编译后的class文件的反编译工具.rar 使用它就能够查看编译过的代码程序了
很好用的java class文件反编译工具,将class文件设置为该文件打开方式,直接点击class文件就能看到源码。
将编译后的class文件反编成Java文件非常实用