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;
	}

}

  

 

  

Javac语法糖之其它的更多相关文章

  1. Javac语法糖之内部类

    在Javac中解语法糖主要是Lower类来完成,调用这个类的入口函数translateTopLevelClass即可.这个方法只是JavacCompiler类的desugar方法中进行了调用. 首先来 ...

  2. Javac语法糖之EnumSwitch

    在Switch中可以使用的类型有枚举.字符串类型与整形int类型,下面来具体看这几个类型. 1.switch为枚举类型 枚举类: enum Fruit { APPLE,ORINGE } 调用javac ...

  3. Javac语法糖之增强for循环

    加强的for循环有两种,遍历数组和实现了Iterable接口的容器.javac通过visitForeachLoop()方法来实现解语法糖,代码如下: /** Translate away the fo ...

  4. Javac语法糖之TryCatchFinally

    https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.3 Optionally replace a try s ...

  5. Javac语法糖之Enum类

    枚举类在Javac中是被当作类来看待的. An enum type is implicitly final unless it contains at least one enum constant ...

  6. Java中的10颗语法糖

    语法糖(Syntactic Sugar):也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用.通常来说,使用语法糖能够增加程序的可读性,减少程序代码出错的 ...

  7. 转:【深入Java虚拟机】之六:Java语法糖

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/18011009 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家P ...

  8. 【转】剖析异步编程语法糖: async和await

    一.难以被接受的async 自从C#5.0,语法糖大家庭又加入了两位新成员: async和await. 然而从我知道这两个家伙之后的很长一段时间,我甚至都没搞明白应该怎么使用它们,这种全新的异步编程模 ...

  9. Java的语法糖

    1.前言 本文记录内容来自<深入理解Java虚拟机>的第十章早期(编译期)优化其中一节内容,其他的内容个人觉得暂时不需要过多关注,比如语法.词法分析,语义分析和字节码生成的过程等.主要关注 ...

随机推荐

  1. Restful风格wcf调用4——权限认证

    写在前面 在前面的三篇文章,已经介绍了restful风格wcf,如何实现增删改查以及文件的上传下载操作.本篇文章将介绍一下,调用restful的权限认证的内容.在调用的接口,为了安全,总会需要对请求进 ...

  2. Android在layout xml中使用include[转]

    在Android的layout样式定义中,可以使用xml文件方便的实现,有时候为了模块的复用,使用include标签可以达到此目的.例如: <include layout="@layo ...

  3. C++ 引用 指针 使用举例

    1. 请看下程序 inline void CScanLineFill::removeOldNodeAET(AET* &aetList, const float yCurrent) { AET* ...

  4. APUE(5)---标准I/O库 (3)

    十.定位流 #include <stdio.h> long ftell(FILE *fp); //若成功,返回当前文件位置指示:若出错,返回-1L int fseek(FILE *fp, ...

  5. Postman - 測試 API 的好工具

    POSTMAN in Google APP Store 因為工作的關係,常常寫一些 API 供 APP 使用.以前傻傻的,每次測試的時候都會自己刻一個 HTML 的表單,一個一個填入 input ,接 ...

  6. Android-XML格式描述

    XML是W3C公司提出的标准,使用范围非常广阔,在框架的配置,程序的配置,布局文件的定义,网络传输等,无所不在: 以前学Java的时候,对XML的名词定义是,根节点,子节点 等等,而在Android里 ...

  7. redis开机自启动脚本(linux)

    目前redis放在home下的文件夹中,写一个脚本,待系统启动的过程中,去启动该脚本. 脚本:redis.sh #!/bin/sh /home/juepei/Downloads/redis-3.0.0 ...

  8. CSharp如何自定义鼠标样式

    一.如何设置鼠标样式? 在CSharp的WinForm开发中,可以通过下面的API设置鼠标样式: //把鼠标样式设置为十字(系统自带的一种鼠标样式) this.Cursor = Cursors.Cro ...

  9. RTOS双向链表数据结构

    在学习RTOS操作系统时,在任务优先级设置时用到了双向链表,说实话数据结构的东西只是停留在大学上课阶段,并未实践过,在操作系统中看得云里雾里,遂将其单独拿来了进行了一下思考,经过一个上午的摸索逐渐领会 ...

  10. SSRS (一)创建基础报表

    ReportService创建基础报表 1.数据库SQL Server2012选择SQL Server Data Tools 2.创建商业智能(BI)项目 选择报表服务器项目 ReportServic ...