### 1、Java Aot（偏概念性）

Aot 是 Ahead-Of-Time 的缩写，大家都知道 Java 是一个半编译、半解释型语言。它把 Java 文件编译成 class 文件，之后 JVM 解释执行 class 文件，JVM 可以把 class 文件解释为对应的机器码，这个就是所谓的 JIT。Aot 则是直接把 class 文件编译系统的库文件，不在依靠 JIT 去做这个事情。

* 好处是：

内存占用低，启动速度快，可以无需 runtime 运行，直接将 runtime 静态链接至最终的程序中

* 坏处是：

无运行时性能加成，不能根据程序运行情况做进一步的优化，程序运行前编译会使程序安装的时间增加


### 2、Solon Aot（偏实践性）

Solon Aot （Ahead-of-Time Processing） 是 Solon Native 的关键技术，参与了 Java Aot 的部分生成命周期。它在编译时，将所有框架可探测到的：

* 动态类代理预编译为Java代码（否则是由Asm字节码生成）
* Jdk 代理接口进行元信息登记
* 反射类进行元信息登记
* 资源文件进行元信息登记
* 等

大概的编译过程：

* 常规编译
* 编译时执行 SolonAotProcessor（solon-aot 里的处理类）
  * 会启动程序（通过程序的自然运行，收集容器信息、原生元信息等）
* 编译时生成动态类代理并编译为class文件
* 编译为原生程序 

### 3、RuntimeNativeRegistrar

Solon Aot 在自动处理之外，还提供了重要一项目定制接口"RuntimeNativeRegistrar"：

```java
public interface RuntimeNativeRegistrar {
    void register(AppContext context, RuntimeNativeMetadata metadata);
}
```

用于在 SolonAotProcessor 执行时，（由开发者）添加无法自动处理的元信息登记。

### 4、NativeDetector

Solon 内核还提共了一个环境探测工具（用于开发时，做编码控制）：

* isAotRuntime()，是否为 Aot 运行时
* inNativeImage()，是否在原生镜像上执行

### 5、批量获取资源或反射方法、反射字段

Native 环境上，是不能直接通过 `ClassLoader:getResources`（获取资源集合），`Class:getMethods()`（获取类的公有方法集合），需要通过从注册元数据里获取。

需要借用两个内核工具：

| 工具                                        | 描述 | 
| ------------------------- | -------- | 
| `ScanUtil`           | 兼容原生编译的资源或文件扫描 |
| `ResourceUtil`     | 兼容原生编译的资源获取或查找     | 
| `ReflectUtil`        | 兼容原生编译的基础反射工具 |


