注解,保留策略

http://stackoverflow.com/questions/3107970/how-do-different-retention-policies-affect-my-annotations

  • RetentionPolicy.SOURCE 注解只在编译时发挥作用,不会影响到编译后生成的字节码。比如:@Override,@SuppressWarnings
  • RetentionPolicy.CLASS 当类加载完毕时,注解便被丢弃.默认保留策略
  • RetentionPolicy.RUNTIME 注解不会被丢弃,可以在运行时通过反射获取到(getAnnotations())。比如 @Deprecated

http://www.oracle.com/technetwork/articles/hunter-meta-3-092019.html

CLASS 和 RUNTIME 都会编译进类文件,打开.class 文件可以发现,CLASS 注解位于 RuntimeInvisibleAnnotations, RUNTIME 位于 RuntimeVisibleAnnotations

mirror 和 apt 已在 Java 8 中移除

现在使用在 java 6 引入的 jsr 269

依赖注入 Dragger

Android 中怎么使用 javax 包的类

ButterKnife

android-apt

Security

Class Loaders

作用:

.class 文件的字节码(虚拟机的指令集)转换为目标硬件平台的机械码。

过程

Class Loader 只加载必要的类,当从 MyProgram.class 开始运行一个 Java 程序的时候:

  1. 首先加载这个类文件的内容(磁盘或网络)
  2. 解析 MyProgram 的字段和超类的类文件
  3. 执行 MyPragram 的 main 方法
  4. 如果 main 方法使用了其他类,则继续加载这些类。

每个 Java 程序最少有三个 Class Loader

  • the bootstrap class loader(BCL)_
  • the extension class loader(ECL)
  • the system class loader(SCL)

BCL 用来解析系统的类(rt.jar),他是虚拟机内建的一部分,一般有 C 实现。不能再 Java 代码中获取到这个 ClassLoader,比如

··· String.class.getClassLoader() ; // 返回 null ```

ECL 用来加载位于 jre/lib/ext 目录下的类

SCL 也叫 Application class loader,用于加载应用程序的类,及 CLASSPATH 里的 jar 文件

class loader 加载一个类时,会先从其父 loader 请求加载这个类。比如 SCL 会先请求 ECL,ECL 会先请求 BCL

注解

Javadoc 的注释不是注解,虽然语法一样(@return 之类),但是他出现在 /*../ 定界符内部,不是代码的一部分。

其他

Android Studio 不是一个完整 Java IDE,我找不到配置 java compiler 的地方。企图在 AS 中建立一个 Java 模块并调试 Annotation Processor(编译时注解) 我碰壁了很久。

命令行调试则比较容易,

先编译好注解处理器

javac "com\example\DemoProcessor.java"

然后就可以使用该处理器了

javac -processor com.example.DemoProcessor  .\com\example\MyClass.java
#output
警告: type:com.example.ClassAnnotation
警告: Element:MyClass

使用其他注解库时,注解不是已经编译好了吗?那又怎么能影响我们的项目呢

http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javac.html#processing

AspectJ 面向切面编程 http://www.ibm.com/developerworks/cn/java/j-aspectj/

BCEL

动态代理

package-info.java’s purpose

package-info.java 声明当前的包,主要作用便是提供一个地方给包添加注释文档,或以包为目标的注解

package com.intertech.service