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. (回文串 Manacher)吉哥系列故事——完美队形II -- hdu -- 4513

    http://acm.hdu.edu.cn/showproblem.php?pid=4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) ...

  2. 破解Oracle ERP密码

    前提:你有apps的数据库账户,想知道某个用户的密码,因为fnd_user中的密码为加密的,所以无法看懂,你可以尝试用下边的方式来查看用户密码. SQL> desc fnd_user; Name ...

  3. 【TypeScript】TypeScript 学习 5——方法

    在 JavaScript 中,有两种方式定义方法. 1.命名的方法 function add(x,y){ return x+y; } 2.匿名方法 var myAdd = function(x,y) ...

  4. C99 中 main 函数的写法

    今天在论坛看见有人讨论 C 语言中 main 函数的写法,看到结论才知道 main 函数的正确写法. 被老谭酸菜坑了这么多年,还是记录下吧,或许以后某天不搞 .net,回去折腾 C 语言了. 写法1: ...

  5. WPF/Silverlight开发的15个最佳实践(转发)

    英文出处:http://www.kunal-chowdhury.com/2010/08/some-best-practices-for-silverlight.html 作者:Kunal Chowdh ...

  6. ASP.NET WEB API 返回JSON 出现2个双引号问题

    前言          在使用ASP.NET WEB API时,我想在某个方法返回JSON格式的数据,于是首先想到的就是手动构建JSON字符串,如:"{\"result\" ...

  7. Feed back TFS 2017 RC upgrade status to product team in product group 2017.03.01

    作为微软的MVP,有一个我最喜欢的好处,就是可以与产品组(产品研发部门)有零距离接触,可以最先拿到即将发版的产品,并且和产品组沟通,对产品中出现的问题实时反馈. 看到TFS产品组吸收了自己的建议和反馈 ...

  8. python 多线程示例

    原文链接:http://www.cnblogs.com/whatisfantasy/p/6440585.html 1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的 ...

  9. 2018-2019-2 20175306实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告

    2018-2019-2 20175306实验三敏捷开发与XP实践<Java开发环境的熟悉>实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先 ...

  10. jQuery基础笔记(2)

    day54 筛选器 参考:https://www.cnblogs.com/liwenzhou/p/8178806.html#autoid-1-7-5 筛选器方法 下一个元素: $("#id& ...