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虚拟机>的第十章早期(编译期)优化其中一节内容,其他的内容个人觉得暂时不需要过多关注,比如语法.词法分析,语义分析和字节码生成的过程等.主要关注 ...
随机推荐
- oracl中的大数据类型clob
建表 create table test_name( test_id number(6) not null, img_data clob ); 在java中该表所对应的po为: class Tes ...
- Linux下配置Nginx(在root的/etc/rc.local里配置开机启动功能http://tengine.taobao.org/)
上面是下载的包下载地址 http://tengine.taobao.org/download_cn.html nginx官网http://nginx.org/ 下一步 下一步 其中remote为重要属 ...
- spring mvc + velocity 搭建实例程序maven版本并且使用的是tomcat容器而不是jetty(step by step)
笔者最近在学习spring mvc 查了很多资料,但用jsp的居多,但项目中需要用velocity,所以说就学习了一下,现将所查资料以及搭建过程陈述如下,供需要的人参考 1.楼主用的是eclipse+ ...
- C#默认以管理员身份运行程序实现代码
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; names ...
- MYsql 之多表查询.
http://www.cnblogs.com/wangfengming/articles/8067220.html
- neutron openvswitch + vxlan 通讯
- 栈的实现——java
和C++一样,JDK包中也提供了"栈"的实现,它就是集合框架中的Stack类.关于Stack类的原理,在"Java 集合系列07之 Stack详细介绍(源码解析)和使用示 ...
- FunDA(13)- 示范:用户自定义操作函数 - user defined tasks
FunDA是一种函数式的编程工具,它所产生的程序是由许多功能单一的细小函数组合而成,这些函数就是用户自定义操作函数了.我们在前面曾经提过FunDA的运作原理模拟了数据流管道.流元素在管道流动的过程中被 ...
- 程序猿的日常——SpringMVC系统架构与流程回顾
web开发经历了很漫长的时间,在国内也快有十几年的时间了.从最开始的进程级到现在的MVC经历了很多的改进和优化,本篇就主要复习了解下Spring MVC相关的知识. 发展历程 第一阶段 CGI进程响应 ...
- linux crontab 实现每秒执行的实例
linux crontab 命令,最小的执行时间是一分钟.如需要在小于一分钟内重复执行,可以有两个方法实现. 1.使用延时来实现每N秒执行 原理:通过延时方法 sleep N 来实现每N秒执行. 创 ...