异常 运行时和编译时

异常(Exception):你能够使用运行时异常或者编译时异常。编程


运行时异常(RuntimeException)也称做未检测的异常(unchecked exception),这表示这种异常不须要编译器来检测。RuntimeException是全部能够在运行时抛出的异常的父类。一个方法除要捕获异常外,若是它执行的时候可能会抛出RuntimeException的子类,那么它就不须要用throw语句来声明抛出的异常。ide

例如:NullPointerException,ArrayIndexOutOfBoundsException,等等函数

受检查异常(checked exception)都是编译器在编译时进行校验的,经过throws语句或者try{}cathch{} 语句块来处理检测异常。编译器会分析哪些异常会在执行一个方法或者构造函数的时候抛出。spa


面向切面的编程(Aspect Oriented Programming-AOP):切面能够在编译时,运行时或,加载时或者运行时织入。代理


  • 编译期:编译期织入是最简单的方式。若是你拥有应用的代码,你能够使用AOP编译器(例如,ajc – AspectJ编译器)对源码进行编译,而后输出织入完成的class文件。AOP编译的过程包含了waver的调用。切面的形式能够是源码的形式也能够是二进制的形式。若是切面须要针对受影响的类进行编译,那么你就须要在编译期织入了。继承

  • 编译后:这种方式有时候也被称为二进制织入,它被用来织入已有的class文件和jar文件。和编译时织入方式相同,用来织入的切面能够是源码也能够是二进制的形式,而且它们本身也能够被织入切面。编译器

  • 装载期:这种织入是一种二进制织入,它被延迟到JVM加载class文件和定义类的时候。为了支持这种织入方式,须要显式地由运行时环境或者经过一种“织入代理(weaving agent)“来提供一个或者多个“织入类加载器(weaving class loader)”。源码

  • 运行时:对已经加载到JVM里的类进行织入it


继承 – 发生在编译时,由于它是静态的io

代理或者组合 – 发生在运行时,由于它更加具备动态性和灵活性。