Javac会通过调用引用对象的getClass()来判空,主要有几处:

(1)JCMethodInvocation()方法中,如下实例:

class A{
	class B{}
}

public class Test06 extends A.B{
	public Test06(A a){
		a.super();
	}
}

要保证a不能为null值。 

(2)visitNewClass()方法中对明确指定的encl属性不能为空

(3)visitStringSwitch()方法中的给switch传递的参数

String fruit = "";
switch (fruit) {}

JLS明确规定,switch()中的参数不能为null,那么Javac是通过调用对象的getClass()方法进行判空的。  

对于程序的fruit树节点,如下:

要调用Attr.makeNullcheck()方法传递fruit树节点,返回结果如下:

生成的字节码如下:

public void md();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=1
         0: ldc           #2 // String
         2: astore_1
         3: aload_1
         4: dup
         5: invokevirtual #3 // Method java/lang/Object.getClass:()Ljava/lang/Class;
         8: pop
         9: pop
        10: return

  

Javac中的nullcheck的更多相关文章

  1. javac中不引人注目的编码小坑

    来看下面这段java程序: public class Test{ public static void main(String[] args){ System.out.println("哈哈 ...

  2. Javac中的方法

    例1: interface IA{ void m(int a); } abstract class AC implements IA{ // 这个抽象方法覆盖了 IA中的方法m public abst ...

  3. Javac中对import关键字进行的处理

    参考文章: (1)关于类的符号输入过程第二篇 ImportScope中存储的为ImportEntry,继承了Scope.Entry类并且多定义了个origin属性,也就是符号的最终来源.除此之外还对g ...

  4. javac文件系统

    1.文件 Java编译器在编译的过程中会涉及到对各种文件的搜索和查找,例如在文件夹下搜索.java源在压缩包*.jar内搜索.class文件,同时也会将编译生成的二进制文件写入文件.Java编译器有自 ...

  5. 第六章-Javac符号表

    需要参考: (1)Architecture of a Java Compiler (2)关于符号Symbol第一篇 (3)关于符号Symbol第二篇 (4)关于类型Type (5)关于作用域范围Sco ...

  6. Javac语法糖之内部类

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

  7. Javac语法糖之EnumSwitch

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

  8. Javac语法糖之Enum类

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

  9. Javac的命令(-Xlint)

    在OptionName类中的枚举定义如下: XLINT("-Xlint"), XLINT_CUSTOM("-Xlint:"), -Xlint     Enabl ...

随机推荐

  1. struts2访问web资源

    通过ActionContext访问 public class TestActionContextAction { public String execute(){ //获取 ActionContext ...

  2. Oracle 数据库 dbConsole 配置笔记

    Oracle安装后,DBConsole有时安装会失败,这时可以通过以下命令恢复: set oracle_sid=orclemca -repos recreateemca -config dbcontr ...

  3. 1.gil全局解释器锁, 2. 死锁与递归锁 3. 信号量 4. Event事件 5. 线程queue

    gil本质就是一把互斥锁,相当于执行权限,每个进程都会存在一把gil,同一进程内的多个线程必须抢到gil 之后才能使用cpython解释器来执行自己的代码,同一进程下的多线程不能并行,但可以实现并发 ...

  4. Ng第二课:单变量线性回归(Linear Regression with One Variable)

    二.单变量线性回归(Linear Regression with One Variable) 2.1  模型表示 2.2  代价函数 2.3  代价函数的直观理解 2.4  梯度下降 2.5  梯度下 ...

  5. (转)MVC一个页面多个submit

    转自:http://stackoverflow.com/questions/442704/how-do-you-handle-multiple-submit-buttons-in-asp-net-mv ...

  6. codeforces 877e

    E. Danil and a Part-time Job time limit per test 2 seconds memory limit per test 256 megabytes input ...

  7. toast js

    参考别人的,自己改写了下,很好用. <!DOCTYPE html> <html lang="zh-CN"> <head> <meta ch ...

  8. [C#]剖析异步编程语法糖: async和await

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

  9. .net图表之ECharts随笔03-热力地图

    基于01和02 要得到如图所示的热力地图(我从NuGet上下载的包没有heatmap.js文件,没法直接搞热力图,只好暂时先搞着地图.后面尽量搞一下),一般要设置四个参数——title.tooltip ...

  10. nginx,gunicorn常用命令

    nginx 启动: 在下载nginx的目录下直接输入nginx回车 停止: nginx -s stop 重启: nginx -s reload 查看当前运行进程: ps -ef | grep ngin ...