Javac语法糖之其它
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语法糖之其它的更多相关文章
- Javac语法糖之内部类
		在Javac中解语法糖主要是Lower类来完成,调用这个类的入口函数translateTopLevelClass即可.这个方法只是JavacCompiler类的desugar方法中进行了调用. 首先来 ... 
- Javac语法糖之EnumSwitch
		在Switch中可以使用的类型有枚举.字符串类型与整形int类型,下面来具体看这几个类型. 1.switch为枚举类型 枚举类: enum Fruit { APPLE,ORINGE } 调用javac ... 
- Javac语法糖之增强for循环
		加强的for循环有两种,遍历数组和实现了Iterable接口的容器.javac通过visitForeachLoop()方法来实现解语法糖,代码如下: /** Translate away the fo ... 
- Javac语法糖之TryCatchFinally
		https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.3 Optionally replace a try s ... 
- Javac语法糖之Enum类
		枚举类在Javac中是被当作类来看待的. An enum type is implicitly final unless it contains at least one enum constant ... 
- Java中的10颗语法糖
		语法糖(Syntactic Sugar):也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用.通常来说,使用语法糖能够增加程序的可读性,减少程序代码出错的 ... 
- 转:【深入Java虚拟机】之六:Java语法糖
		转载请注明出处:http://blog.csdn.net/ns_code/article/details/18011009 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家P ... 
- 【转】剖析异步编程语法糖: async和await
		一.难以被接受的async 自从C#5.0,语法糖大家庭又加入了两位新成员: async和await. 然而从我知道这两个家伙之后的很长一段时间,我甚至都没搞明白应该怎么使用它们,这种全新的异步编程模 ... 
- Java的语法糖
		1.前言 本文记录内容来自<深入理解Java虚拟机>的第十章早期(编译期)优化其中一节内容,其他的内容个人觉得暂时不需要过多关注,比如语法.词法分析,语义分析和字节码生成的过程等.主要关注 ... 
随机推荐
- Flex box 弹性盒子布局
			display: -webkit-flex 标识使用弹性布局 flex: num 占容器的比例 Flex等比划分 导航1 : Flex :1; 导航2 Flex: 2; ————&g ... 
- iterm2 学习笔记
			itrem 笔记 选中即复制,有两种方式. 在新Tab中自动使用前一Tab路径,该怎么用? 系统热键:option+space 自动完成:输入打头几个字母,然后输入command+“;” iterm2 ... 
- Oracle EBS 常用网站列表
			http://www.lifandong.com/erp/356 Oracle EBS 常用网站列表 英文站: Oracle EBS R12 官方参考手册(User Guide, Implementa ... 
- Python中通过open()操作文件时的文件中文名乱码问题
			最近在用Python进行文件操作的时候,遇到创建中文文件名的乱码问题. Python默认是不支持中文的,一般我们在程序的开头加上#-*-coding:utf-8-*-来解决这个问题,但是在我用open ... 
- mssql内存表
			自MSSQL2014开始引入内存表. 怎样创建内存表: USE testGO ALTER DATABASE testADD FILEGROUP fg_test CONTAINS MEMORY_OPTI ... 
- 【Win10】页面的导航效果
			CommonNavigationTransitionInfo ContinuumNavigationTransitionInfo DrillInNavigationTransitionInfo Ent ... 
- Python学习-24.Python中的算术运算
			加法:+,与C#中并无区别,并且一样可以作用于字符串. 但Python中不支持字符串与数值类型的相加. i = 1 s = ' print(s + i) 这样是会在运行时报错的,正确写法如下: i = ... 
- Elasticsearch、Kibana Windows下环境搭建
			Elasticsearch 簡介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是 ... 
- 自定义两个控件,一个是显示图标和文字的矩形,一个是带边框的label(但是不是label)
			记录遇到的两个坑 坑1. 一开始我继承button 来实现下面的控件1,后面发现button没有双击事件.就改成继承UserControl了.重新编译,导致设计时的控件文本全部被清空,因为UserCo ... 
- PHP RBAC权限管理 基于角色的访问控制演示
			RBAC rbac:Role Based Access Controll,基于角色的访问控制. 今天理一理RBAC,话不多说,直接切入主题 功能需求: 权限管理(无限极) 角色管理(可以分配权限) 管 ... 
