为什么不同大小的.class文件相同?

时间:2014-07-16 03:51:14

标签: java javac

我注意到给我的.class文件(在构建服务器上使用Ant javac编译)和使用Maven(本地)之间的文件大小存在差异。我查看了类文件的内容并看到了差异,我有兴趣了解这些差异的来源。

反编译

给我:

public class TableData
{
  public static String[] getTableNames()
  {
    ArrayList localArrayList = new ArrayList(TableData.Table.values().length);
    for (TableData.Table localTable : TableData.Table.values()) {
      localArrayList.add(localTable.getName());
    }
    return (String[])localArrayList.toArray(new String[localArrayList.size()]);
  }

本地版本:

public class TableData
{
  public static String[] getTableNames()
  {
    List<String> tableNames = new ArrayList(TableData.Table.values().length);
    for (TableData.Table table : TableData.Table.values()) {
      tableNames.add(table.getName());
    }
    return (String[])tableNames.toArray(new String[tableNames.size()]);
  }

文件大小

给我:1371字节

本地版本:1819字节

使用javap

很多相似之处,例如:

InnerClasses:
   public static final #17= #16 of #14; //Table=class (et cetera)
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_SUPER

给我:

#23 = Utf8               Code
#24 = Utf8               LineNumberTable
#25 = Utf8               getTableNames
#26 = Utf8               ()[Ljava/lang/String;

本地版本:

#23 = Utf8               Code
#24 = Utf8               LineNumberTable
#25 = Utf8               LocalVariableTable
#26 = Utf8               this
#27 = Utf8               L.../TableData;
#28 = Utf8               getTableNames
#29 = Utf8               ()[Ljava/lang/String;

编译器调用

给我:

<javac target="1.7"  source="1.7" srcdir="${src.dir}"
    excludes="..." destdir="..." classpathref="app.classpath"
    verbose="${compile.verbose}" debug="${compile.debug}"
    debuglevel="${compile.debuglevel}"  includeAntRuntime="true" />


compile.debug: on
compile.debugLevel: lines,source

本地版本:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <source>1.7</source>
        <target>1.7</target>
    </configuration>
</plugin>

问题:为什么?

1 个答案:

答案 0 :(得分:1)

从Maven编译器插件的文档:

  

debug
  boolean
  设置为true以在已编译的类文件中包含调试信息   默认值为:true。

更改此配置属性会删除文件大小的差异:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <debug>false</debug>
        <source>1.7</source>
        <target>1.7</target>
    </configuration>
</plugin>