`
free_xiang
  • 浏览: 52660 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

关于java文件编译后,同一个文件出现"$"的class

    博客分类:
  • java
阅读更多

在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 在实现类中没有缺省的构造函数,在调用的同时,就会产生额外的文件

分享到:
评论

相关推荐

    java反编译工具(.class文件反编译成.java文件)

    标签再次强调了这是一个用于将.class文件反编译为.java文件的工具,这表明其主要功能和适用场景。 在压缩包子文件的文件名称列表中,我们看到了"jd-gui-0-2"。这很可能是反编译工具的名字,例如JAD GUI的一个版本号...

    java class文件反编译

    1、打开一个或者多个*.class文件,XJad反编译后,重命名为*.java文件, 保存至当前文件夹,并在编辑器中打开查看; 2、打开一个文件夹,XJad将该文件夹下所有*.class文件进行反编译,并保存至该文件夹下, 依据包...

    Java反编译工具把.class文件转换为.java文件

    ### Java反编译工具:将.class文件转换为.java文件 #### 概述 在软件开发领域,有时我们可能需要分析第三方库或者开源项目的内部结构,这时就需要借助于反编译工具来帮助我们阅读和理解其源码。Java作为一种广泛...

    java反编译软件,可以将编译后的class文件反编译成java文件

    Java反编译是编程领域中的一个重要概念,它涉及到软件逆向工程,主要用于理解或学习已编译的Java字节码(.class文件)的工作原理。Java的源代码被编译成字节码后,虽然失去了人类可读的形式,但通过反编译工具,我们...

    Java Class文件反编译工具 jd-gui

    Java Class文件是Java程序编译后的二进制格式,它包含了类和接口的定义、方法体、常量池等信息,但这些信息是以机器可读的字节码形式存在,对于人类来说不易理解。为了查看和理解Class文件内部的源代码,我们就需要...

    java class文件编译

    Java源代码(.java文件)在经过Java编译器(javac)处理后,会生成对应的Class文件。Class文件采用一种特殊的二进制格式,这种格式具有固定结构,主要包括以下几个部分: 1. 魔数:标识文件为Java类文件,固定为0...

    JAVA反编译软件(可将class文件反编译为java文件)

    Java反编译是Java开发中一个重要的辅助工具,它能够帮助开发者查看已编译的`.class`文件中的源代码,即使原始的`.java`源文件已经丢失或未被提供。这个过程对于理解类库的工作原理、逆向工程、调试、学习或者分析...

    么把.class文件反编译成.java 经修改后再编译成.class

    其中,JAD 是一个流行的反编译工具,它可以将.class 文件反编译成.java 文件。 二、JAD 反编译工具的使用 使用 JAD 反编译工具非常简单。首先,需要下载 JAD 反编译工具并将其解压缩到指定目录下。然后,打开...

    java反编译(将class文件反向编译成java源文件)

    2. **JD-GUI**:这是JAD的一个图形界面版本,可以直接打开.jar或.class文件,并展示反编译后的源代码。它非常适合快速查看和理解已编译的代码。 3. **Procyon**:另一个开源的Java反编译器,它不仅支持反编译,还...

    java反编译项目工程-可以将class 文件进行修改重新导包生成修改后的jar

    java反编译项目工程,可以将class 文件 进行 修改 重新导包 生成修改后的jar 步骤 1、将需要修改的 jar 包 放入 lib 目录下,并加入项目中 ,选中 jar 右击 选择 add a libray这个时候会看到 jar 的 目录 结构 2、...

    Java反编译 jd-gui反编译class文件

    在Java反编译领域,jd-gui是一个非常实用的工具,它允许开发者直接打开.class文件,无需IDE,提供了一种方便快捷的方式来查看和理解Java字节码。 jd-gui是一个图形用户界面的应用程序,它将字节码转换为可读的Java...

    java编译class文件

    要将`.java`文件编译成`.class`文件,我们需要使用Java的JDK(Java Development Kit)中的`javac`编译器。 以下是一般的编译步骤: 1. 安装JDK:首先,你需要在计算机上安装适合你操作系统的JDK版本。例如,对于...

    java class反编译工具

    在描述中提到的工具,是一个小巧而实用的Java Class反编译器,用户只需运行`.exe`可执行文件,然后选择要反编译的`.class`文件,即可在指定目录下生成对应的`.java`文件。 Java字节码是Java源代码经过编译后的中间...

    java .class反编译成.java工具

    常用的Java反编译工具有jad、FernFlower、Cfr等,而jd-gui.exe是其中一种图形界面的反编译工具,它提供了一个直观的方式来查看和分析.class文件。 jd-gui.exe的使用步骤如下: 1. **下载与安装**:首先,你需要从...

    java.class文件反编译工具【免费】

    然而,需要注意的是,由于编译过程的优化和去冗余,反编译的结果可能并不完全等同于原始的.java文件,可能会存在一些小的差异,如变量名的丢失或顺序的改变。尽管如此,它仍然能提供足够的信息来理解代码的工作方式...

    java jar反编译工具 java Class反编译工具

    Java开发过程中,有时我们需要查看或理解已编译的Class文件中的源代码,因为Java的编译过程会将源代码转化为字节码(.class文件)。在这种情况下,反编译工具就派上了用场。本篇文章将详细介绍Java的jar反编译工具...

    反编译软件,可以将class文件反编译为java文件

    在IT领域,反编译是一种将已编译的字节码(如Java的.class文件)转换回源代码(如Java的.java文件)的过程。标题提到的"反编译软件"是一种工具,它允许用户查看和理解Java类文件的内部结构,即使原始的源代码不再...

    class文件反编译工具

    在Java编程语言中,`.class`文件是Java字节码的载体,它是Java源代码(`.java`文件)经过编译后的结果。这些字节码文件可以在任何支持Java的平台上运行,无需关心底层硬件架构。然而,由于`.class`文件是二进制格式...

    Java class文件反编译工具集

    Java class文件是Java程序编译后的二进制代码,它包含了类、方法、变量等信息。但是,由于class文件是以机器可读的形式存在,对于人类来说并不直观。这时,我们就需要借助于反编译工具来将class文件转换回源代码...

    查看java编译后的class文件的反编译工具.rar

    这就是"查看java编译后的class文件的反编译工具"所扮演的角色。 这个压缩包文件包含了一个用于查看和分析Java字节码的反编译工具。反编译工具能够将.class文件转换回接近原生的Java源代码,帮助开发者了解程序的...

Global site tag (gtag.js) - Google Analytics