编译java文件

javac xxx.java

 
编译多个java文件

javac -d .   ../src/*.java

 

直接执行class文件

java xxx

 

执行jar文件

java -jar xxx.jar

 

执行jar的指定类

java -cp xxx.jar  xxxnamespace.xxxClass

 

创建jar文件

jar cvf TVFrame_xx_android.jar vline

cvf:
TVFrame_xx_android.jar : 要生成的jar文件的名称
vline : class 文件所在目录


实际操作如下:

E:\TVFrame_xx\bin_out\TVFrame_xx_android\classes>jar cvf TVFrame_xx_android.jar vline
标明清单(manifest)
增加:vline/(读入= 0) (写出= 0)(存储了 0%)
增加:vline/android_impl/(读入= 0) (写出= 0)(存储了 0%)
增加:vline/android_impl/CRC32.class(读入= 929) (写出= 607)(压缩了 34%)
增加:vline/android_impl/R$attr.class(读入= 340) (写出= 238)(压缩了 30%)
增加:vline/android_impl/R$drawable.class(读入= 400) (写出= 275)(压缩了 31%)
增加:vline/android_impl/R$layout.class(读入= 394) (写出= 276)(压缩了 29%)
增加:vline/android_impl/R$string.class(读入= 398) (写出= 280)(压缩了 29%)
增加:vline/android_impl/R.class(读入= 493) (写出= 300)(压缩了 39%)
增加:vline/android_impl/Tools_android.class(读入= 1593) (写出= 796)(压缩了 50%)

增加:vline/android_impl/VLGraphic_android.class(读入= 9082) (写出= 3803)(压缩了
 58%)
增加:vline/android_impl/VLGraphic_android_view.class(读入= 821) (写出= 407)(压
缩了 50%)
增加:vline/android_impl/VLNetwork_android.class(读入= 14939) (写出= 8452)(压缩
了 43%)
增加:vline/android_impl/VLPng_android.class(读入= 6300) (写出= 3574)(压缩了 43%
)
增加:vline/android_impl/VLSound_android.class(读入= 761) (写出= 359)(压缩了 52%
)
增加:vline/TVFrame/(读入= 0) (写出= 0)(存储了 0%)
增加:vline/TVFrame/Time.class(读入= 1570) (写出= 872)(压缩了 44%)
增加:vline/TVFrame/Tools.class(读入= 2079) (写出= 1086)(压缩了 47%)
增加:vline/TVFrame/VLEventListener.class(读入= 179) (写出= 152)(压缩了 15%)
增加:vline/TVFrame/VLFactory.class(读入= 2840) (写出= 1335)(压缩了 52%)
增加:vline/TVFrame/VLGraphic.class(读入= 1248) (写出= 569)(压缩了 54%)
增加:vline/TVFrame/VLKeyCode.class(读入= 609) (写出= 337)(压缩了 44%)
增加:vline/TVFrame/VLNetwork.class(读入= 704) (写出= 408)(压缩了 42%)
增加:vline/TVFrame/VLPackage.class(读入= 4931) (写出= 2215)(压缩了 55%)
增加:vline/TVFrame/VLSound.class(读入= 231) (写出= 177)(压缩了 23%)

E:\viewline_LeisureGame\branches\开发库\TVFrame_xx\bin_out\tvFrame_xx_android\classes>



Java代码编译和反编译
 也许我们很少会使用到javap工具,因为现在有很多好的反编译工具,但是我在此介绍这个工具不是使用它进行反编译,而是查看java编译器为我们生成的字节码,通过
 比较字节码和源代码,我们可以发现很多的问题,一个很重要的作用就是了解很多编译器内部的工作机制,在笔者以前的几篇文章中就是借助此工具的,本站有这些文
 章的原文《深入剖析java类的构造方式》和《使用String还是StringBuffer》。
 下面我们通过具体的一个例子来简单的讲讲这个工具的作用,你不需要很深入的使用,这个简单的介绍和简单的使用就可以使你受益非浅。
 源代码:



Java代码
class StringTest    
{   
    public static void main(String[] args)    
    {   
        String result="";   
        result+="ok";   
    }   
}  


在反编译前你当然需要先编译这个类了:javac -g StringTest.java(使用-g参数是因为要得到下面javap -l时的输出需要使用此选项)
编译完成后,我们在使用不同的选项看看不同的效果:
1、先看看最简单的不带参数的情况:javap StringTest:

Java代码 
Compiled from StringTest.java   
class StringTest extends java.lang.Object {   
    StringTest();   
    public static void main(java.lang.String[]);   
}  


 不带参数的情况将答应类的public信息,包括成员和方法
从上面的输出中我们确定了两个知识:如果类没有显示的从其它类派生那么它就是从Object派生;如果没有为类显示的申明构造方法,
那么编译器将为之生成一个缺省构造方法(不带参数的构造方法)

2、javap -c StringTest:

输出

Compiled from StringTest.java
class StringTest extends java.lang.Object {
StringTest();
public static void main(java.lang.String[]);
}


Method StringTest()
   0 aload_0
   1 invokespecial #1 <Method java.lang.Object()>
   4 return

Method void main(java.lang.String[])
   0 ldc #2 <String "">
   2 astore_1
   3 new #3 <Class java.lang.StringBuffer>
   6 dup
   7 invokespecial #4 <Method java.lang.StringBuffer()>
  10 aload_1
  11 invokevirtual #5 <Method java.lang.StringBuffer append(java.lang.String)>
  14 ldc #6 <String "ok">
  16 invokevirtual #5 <Method java.lang.StringBuffer append(java.lang.String)>
  19 invokevirtual #7 <Method java.lang.String toString()>
  22 astore_1
  23 return

 带-p参数将额外的打印字节码信息
前面的和不带参数的输出一样,后面的显示了方法的具体的字节码,从这个输出里面我们又可以了解更多的内容,首先是编译器生成的的缺
省构造方法的内容为调用父类的构造方法super()(需要说明的是使用DJ反编译的源代码中这个缺省构造方法没有这个调用,这可能是该反编
译器的一种优化),main()方法的字节码信息的内容可以参考《使用String还是StringBuffer》一文的叙述。

 

3、javap -l StringTest :

输出

Compiled from StringTest.java
class StringTest extends java.lang.Object {
StringTest();
public static void main(java.lang.String[]);
}

Line numbers for method StringTest()
line 1: 0

Local variables for method StringTest()
StringTest this pc=0, length=5, slot=0

Line numbers for method void main(java.lang.String[])
line 5: 0
line 6: 3
line 7: 23

Local variables for method void main(java.lang.String[])
java.lang.String[] args pc=0, length=24, slot=0
java.lang.String result pc=3, length=20, slot=1

-l参数将显示行号和局部变量表

从上面的输出中我们可以得到方法中的变量和方法的源代码对于字节码信息的,例如对应main()方法,它的变量为输入参数args以及局部变量 result,方法的源代码的第5行对应字节码的第0个偏移量,第5行对应字节码的第3个偏移量,而第7行对应字节码的第23偏移量(参看 javap -c的输出前面的偏移量),第7行实际是没有语句的,但是有一个隐含的return,而偏移量23实际对应的也是return调用

4、javap -p StringTest:

输出

Compiled from StringTest.java
class StringTest extends java.lang.Object {
StringTest();
public static void main(java.lang.String[]);
}

 -p参数将额外的打印private成员和方法的信息,因为这个类没有因此输出相同

这几个参数几乎就可以构成javap的最常使用的集合,最常用的应该还是-c选项,因为可以打印字节码的信息,关于这些字节码的详细涵义在Java 虚拟机规范中定义,感兴趣的可以查看相关的信息!