1、变长参数
class VarialbeArgumentsDemo { public static void doWork(int... a) {//可变参数 } public static void main(String[] args) { doWork(1); doWork(1,2,3); } }
经过反编译后的代码如下:
class VarialbeArgumentsDemo { VarialbeArgumentsDemo() { } public static void doWork(int... var0) { } public static void main(String[] var0) { doWork(new int[]{1}); doWork(new int[]{1, 2, 3}); } }
2、条件编译
Java 语言中条件编译的实现,也是 Java 语言的一颗语法糖,根据布尔常量的真假,编译器将会把分支中不成立的代码块消除掉,这一工作将在编译器接触语法糖阶段完成。由于这种条件编译的实现方式使用了 if 语句,所以它必须遵循最基本的Java 语法,只能写在方法体内部,因此它只能实现语句基本块级别的条件编译,而无法根据条件调整 Java 类的结构。
if(true){ System.out.println("True"); }else{ System.out.println("False"); }
在class中只保留:
System.out.println("True");
3、自动拆箱/装箱
Java中有8种基本数据类型,它们不是对象。所以没有对应的方法,无法区分‘0’和‘NULL’,操作起来不方便,所以Java将它们封装成对象Byte、Short、Integer、Long、 Character、Float、Double、Boolean,并给出相应的方法。我们把一个基本数据类型赋给封装类对象,需要进行类型转换,而把一个封装类对象赋给一个基本数据类型需要解析。我们把这两个过程分别称为,装箱和拆箱。
由于这两个操作经常要使用,装/拆操作繁琐而没有难度,所以Java就给出了自动装/拆箱操作,我们用Integer讨论,其它的7种一样。
public class Test6 { public static void main(String[] args) { Integer num1 = 123; int num2 = num1; } }
进行反编译后如下:
public class Test6 { public Test6() { } public static void main(String[] var0) { Integer var1 = Integer.valueOf(123); int var2 = var1.intValue(); } }
还有如下的一些情况:
// 不允许 while(false){ System.out.println("True"); } // 允许 do{ // }while(false);
4、其它
对一些 +=与-+等的操作符做如下转换:
class LowerSuger { public void t() { Integer a = 2; a++; Integer b = 3; b += a; int c = 4; c -= a; } }
解语法糖之后如下:
class LowerSuger { LowerSuger() { } public void t() { Integer a = Integer.valueOf(2); a = Integer.valueOf(a.intValue() + 1); Integer b = Integer.valueOf(3); b = Integer.valueOf(b.intValue() + a.intValue()); int c = 4; c -= a.intValue(); } }
断言:
class LowerSuger { public void t() { boolean flag = true; assert(flag); assert true : "assert-true-message"; assert false : "assert-false-message"; } }
class LowerSuger { static final boolean $assertionsDisabled = !com / test15 / LowerSuger.desiredAssertionStatus(); LowerSuger() { } public void t() { boolean flag = true; if (!$assertionsDisabled && !flag) throw new AssertionError(); if (!$assertionsDisabled) throw new AssertionError("assert-false-message"); else return; } }