Javac中的nullcheck】的更多相关文章

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传递的参数 S…
来看下面这段java程序: public class Test{ public static void main(String[] args){ System.out.println("哈哈哈"); } } 是不是感觉没什么问题,是的,的确没问题. 但在windows下使用javac Test.java编译该源文件(源文件编码为utf-8)时会报错,如下: Test.java:3: 错误: 编码 GBK 的不可映射字符 (0x88) System.out.println("鍝…
例1: interface IA{ void m(int a); } abstract class AC implements IA{ // 这个抽象方法覆盖了 IA中的方法m public abstract void m(int a); // public <T,X> void fk(){} // public void fk2(List l){} // public void fk4(){} } public class Test04 extends AC{ @Override publi…
参考文章: (1)关于类的符号输入过程第二篇 ImportScope中存储的为ImportEntry,继承了Scope.Entry类并且多定义了个origin属性,也就是符号的最终来源.除此之外还对getOrigin()方法进行了覆写,返回origin属性,这是由于静态导入的原因,举例如下: package com.test19; public class TestStaticParent { public static class AAA{ int a =2; } } 然后在同一个包下编写子类…
1.文件 Java编译器在编译的过程中会涉及到对各种文件的搜索和查找,例如在文件夹下搜索.java源在压缩包*.jar内搜索.class文件,同时也会将编译生成的二进制文件写入文件.Java编译器有自己的文件相关类及管理类,以方便对文件进行各种操作. 为什么要用ct.sym要研究:https://blog.csdn.net/blomule/article/details/40866271 1.1 文件相关实现类 包是存放类/集合的目录或者压缩包.包与类的关系类似于目录/压缩包与文件.Java类库…
需要参考: (1)Architecture of a Java Compiler (2)关于符号Symbol第一篇 (3)关于符号Symbol第二篇 (4)关于类型Type (5)关于作用域范围Scope (6) Java语义分析阶段的一个主要工作是符号表的管理.符号表(symbol table)也称为环境(environment),其作用是将标识符映射到它们的类型和存储位置.在处理类型.变量和方法的定义时,顺便将这些标识符存储到符号表中,同时为这些标识符绑定相关的信息.每当发现标识符的使用(即…
在Javac中解语法糖主要是Lower类来完成,调用这个类的入口函数translateTopLevelClass即可.这个方法只是JavacCompiler类的desugar方法中进行了调用. 首先来看下local class本地类解语法糖,举个例子,如下: class Outer { class AOuter{ int temp = 0; } final int count1 = new Integer(1); final int count2 = 1; static final int co…
在Switch中可以使用的类型有枚举.字符串类型与整形int类型,下面来具体看这几个类型. 1.switch为枚举类型 枚举类: enum Fruit { APPLE,ORINGE } 调用javac生成的代码如下: enum Fruit{ private <init>(/*synthetic*/ String $enum$name, /*synthetic*/ int $enum$ordinal) { super($enum$name, $enum$ordinal); } /*public…
枚举类在Javac中是被当作类来看待的. An enum type is implicitly final unless it contains at least one enum constant that has a class body. 举例如下: enum EnumTest { MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) { @Override public boolean isRest() { return true; } }, SU…
在OptionName类中的枚举定义如下: XLINT("-Xlint"), XLINT_CUSTOM("-Xlint:"), -Xlint     Enable all recommended warnings. In this release, enabling all available warnings is recommended.-Xlint:all   Enable all recommended warnings. In this release,…
在符号表中,很重要的一项内容就是符号的名字.名字的管理,要解决的主要问题就是名字的变长问题.在javac中,所有的符号名字放到了一个公用字符池中,对于相同的名字只保存一个. 其中涉及到的主要类及关系如下图. 每个名字都是一个Name对象,所有的Name对象全部存储到了Name类的内部类Table中.这个table就是上面提到的公用字符池. 看一下Table的实现类SharedNameTable类中重要的属性,如下: /** The hash table for names. */ private…
Javac是什么? 它是一种编译器,将Java对人非常友好的语言,编译转化对所有机器都非常友好的语言,即:JVM能够识别的语言,也就是Java字节码.而Java字节码,说白了就是一连串二进制数字. Javac中有什么?  既然它是编译器, 这时候就要回想一下大学所学<编译原理>:什么词法分析,语法分析,语义分析,目标代码生成,目标代码优化……好吧,我承认这方面,已经被我扔进回收站,等我好好还原一下: 恢复成功,有图为证: 下面详细讲一下,Javac中词法分析器的内部原理: 先上图,看一下词法分…
很多人在初学Java的时候经常会被书中介绍的一堆环境变量的设置搞得头昏脑胀,很多书中都会在初装JDK的时候让他大家设置JAVA_HOME环境变量,在开发程序的时候设置CLASSPATH环境变量,而很多人并不理解这两个环境变量的作用,我们来分别进行详细的阐述.    首先是JAVA_HOME环境变量,我们先来掌握这个环境变量的设置内容,JAVA_HOME这个环境变量的设置内容是JDK的安装目录,比如说您的JDK安装在d:\jdk1.6.0这个目录下,请您查看一下这个目录下是不是有一个子目录bin,…
4.1 Javac是什么 是一种编译器,将JAVA源代码(.java文件)语言先转化成JVM能够识别的一种语言(.class文件),然后由JVM将JVM语言再转化成当前机器可以识别的机器语言. 4.2 javac编译器的基本结构 javac编译器的作用是将符合JAVA语言规范的源代码转化成符合JAVA虚拟机规范的JAVA字节码. 词法分析:从源代码中找出一些规范的token流,就像在人类的语言中分辨出哪些是词语,标点符号,动词,名词等. 语法分析:形成一个符合JAVA语言规范的抽象语法树.语法树…
目录 简介 一个普通的virtual call 普通方法中的null check 反优化的例子 总结 简介 之前我们在讲Virtual call的时候有提到,virtual call方法会根据传递的参数实例的不同而进行优化,从而优化成为classic call,从而提升执行效率. 今天我们考虑一下,在virtual call中执行nullcheck的时候,如果已经知道传递的参数是非空的.JIT会对代码进行优化吗? 一起来看看吧. 一个普通的virtual call 我们来分析一下在方法中调用li…
另一个棘手的核心 Java 问题,wait 和 notify.它们是在有 synchronized 标记的方法或 synchronized 块中调用的,因为 wait 和 modify 需要监视对其上调用 wait 或 notify-get 的 Object.大多数Java开发人员都知道对象类的 wait(),notify() 和 notifyAll()方法必须在Java中的 synchronized 方法或 synchronized 块中调用, 但是我们想过多少次, 为什么在 Java 中 w…
阿里巴巴集团技术丛书 深入分析Java Web技术内幕(修订版)(阿里巴巴集团技术丛书.技术大牛范禹.玉伯.毕玄联合力荐!大型互联网公司开发应用实践!) 许令波 著   ISBN 978-7-121-23293-0 2014年8月出版 定价:79.00元 464页 16开 编辑推荐 让读者知其然,并知其所以然,是<深入分析Java Web技术内幕(修订版)>一书最大的特色. 作者来自淘宝技术一线,亲历了淘宝网PV从1亿到10亿的发展历程,直接经历了在这个过程中技术的不断突破.飞跃等变迁,并积累…
早期(编译期)优化 一.Javac编译器 1.Javac的源代码与调试 Javac的源代码放在JDK_SRC_HOME/langtools/src/shares/classes/com/sun/tools/javac中,除了JDK自身的API之外,就只引用了JDK_SRC_HOME/langtools/src/shares/classes/com/sun/*里面的代码,调试环境建立起来简单方便,因为基本上不需要处理依赖关系. 编译过程大致可以分成3个过程: (1)解析与填充符号表过程 (2)插入…
各种不同平台的虚拟机与所有平台都统一使用的程序存储格式--字节码(ByteCode)是构成平台无关性的基石,除了平台无关性,虚拟机的另外一种中立特性--语言无关性正越来越被开发者所重视.在Java发展之初,设计者就曾经考虑过并实现了让其他语言运行在Java虚拟机之上的可能性,他们在发布规范文档的时候,也刻意把Java的规范拆分成了Java语言规范<The Java Language Specification>及Java虚拟机规范<The Java Virtual Machine Spe…
Java中的注解(Annotation)是一个很神奇的东西,特别现在有很多Android库都是使用注解的方式来实现的.一直想详细了解一下其中的原理.很有幸阅读到一篇详细解释编写注解处理器的文章.本文的原文是ANNOTATION PROCESSING 101,作者是Hannes Dorfmann.这是一篇好文,忍不住翻译学习一下.以下是翻译. 在这篇文章中,我将阐述怎样写一个注解处理器(Annotation Processor).在这篇教程中,首先,我将向您解释什么是注解器,你可以利用这个强大的工…
在这篇文章中,我将阐述怎样写一个注解处理器(Annotation Processor).在这篇教程中,首先,我将向您解释什么是注解器,你可以利用这个强大的工具做什么以及不能做什么:然后,我将一步一步实现一个简单的注解器. 一些基本概念 在开始之前,我们首先申明一个非常重要的问题:我们并不讨论那些在运行时(Runtime)通过反射机制运行处理的注解,而是讨论在编译时(Compile time)处理的注解. 注解处理器是一个在javac中的,用来编译时扫描和处理的注解的工具.你可以为特定的注解,注册…
JDK提供的主要开发工具有:编译程序,解释执行程序.调试程序.Applet执行程序.文档管理程序.包管理程序等. 1.编译程序:javac.exe,对应的javac命令将Java源程序转换为字节码. javac [-选项] file.java file.java:要编译的源文件 [-选项]:可选项,javac中编译选项可以通过在命令提示符下输入javac或者javac -help查看.无任何可选项的时候,编译器就会把生成.class文件和Java源文件.java放在同一个文件夹中.2.解释执行程…
大部分内容参考http://www.linuxidc.com/Linux/2012-04/58178.htm J2SE中提供了一个简单的命令行工具来对java程序的cpu和heap进行 profiling,叫做HPROF.HPROF实际上是JVM中的一个native的库,它会在JVM启动的时候通过命令行参数来动态加载,并成为 JVM进程的一部分.    要使用hprof,可以通过在运行java程序时指定-agentlib或者-Xrunhprof参数来使用,它会将cpu.heap等想着信息保存到一…
我是直接在Ubuntu 12.10 64位系统下操作的,搭建Ubuntu开发环境类似,见Ubuntu 10.04开发环境配置.需要注意的是,64位的系统,需要安装支持32位的库(sudo apt-get install ia32-libs),不然编译时提示找不到交叉编译链. 1.安装java uestc@uestc-ThinkPad-T43:~/tools$ ls jdk1.6.0_24  jdk-6u24-linux-i586.bin uestc@uestc-ThinkPad-T43:~/to…
原地址: http://blog.csdn.net/biaobiaoqi/article/details/6846274 java的运行机制的基本概念: 源文件 也就是我们熟知的.java文件. 类文件  .class 文件是编译器由.java文件编译而成.众所周知,Java的跨平台性在于Java虚拟机(JVM)这一层对硬件的隔离,而.class文件可以理解为 JVM中的执行文件(自己的理解,可能不太准确).里面存储的是java字节码,java bytecode 是基于栈的(stack base…
Java环境配置原理详解 1.Jdk安装目录文件说明: 一般jdk安装目录及路径 \Java\jdk1.7.0_79\lib,里面主要包含以下文件夹. bin:主要存放的是java工具中常用命令如:java,javac等. db:安装java db的路径. include:一些平台特病的头文件. jre:运行java程序所需的jre环境. lib:jdk工具命令的实际存放位置,如:bin中javac命令,实际是lib中tools.jar\sun\tools\javac中的Main.class文件…
2017 Android 面试题 [ 基础与细节 ] 感谢@chuyao抛出的这些问题,平时业务代码写多了,很多基础的东西变得含糊不清了,这次裸辞出来找工作确实没有之前顺利,顺便求上海Android开发的坑. 我自己整理了些答案,不对或者不妥的地方请大家指出,谢谢. 1. Activity建立在哪些窗口组件之上?顺带涉及View的事件传递问题. 没读懂问题,=.=不知道是不是问Activity的UI结构,如果是可以参考这篇文章. 对于View的事件传递,则可以从 Activity --> Vie…
Java程序中有逻辑错误,就需要使用JDB来进行调试了.调试程序在IDE中很方便了,比如这篇博客介绍了在Intellj IDEA中调试Java程序的方法. 我们课程内容推荐在Linux环境下学习,有同学问如何在命令行下调试Java程序,我们就要使用JDB了.在Ubuntu Bash中开三个tabs在命令行下学习Java编程也是一个很好的方法:一个使用vim编辑代码:一个使用javac, java(或ant, gradle...)编译运行代码:一个使用JDB调试代码. 如上图, 我们在Linux…
1. 本章学习总结 尝试使用思维导图总结有关继承的知识点 使用常规方法总结其他上课内容 1.类的重写:在子类中重写的方法需要和父类被重写的方法具有相同的方法名.参数列表以及返回值类型.当子类重写父类的方法后,子类对象将无法访问父类被重写的方法. 2.文档注释:文档注释是嵌入到程序中的帮助信息,用于说明如何使用当前程序.以/**开头,以*/标志结束.javac中提供javac命令,可以用帮助信息生成HTML格式的帮助文档. 3.final关键字:1)修饰类.该类将不能被继承也就是不能派生子类.2)…
一.简介 在现阶段的Android开发中,注解越来越流行起来,比如ButterKnife,Retrofit,Dragger,EventBus等等都选择使用注解来配置.按照处理时期,注解又分为两种类型,一种是运行时注解,另一种是编译时注解,运行时注解由于性能问题被一些人所诟病.编译时注解的核心依赖APT(Annotation Processing Tools)实现,原理是在某些代码元素上(如类型.函数.字段等)添加注解,在编译时编译器会检查AbstractProcessor的子类,并且调用该类型的…