代理编译
1. C语言编译原理
编译共分为四个阶段:预处理阶段、编译阶段、汇编阶段、链接阶段。
1、预处理阶段:
主要工作是将头文件插入到所写的代码中,生成扩展名为“.i”的文件替换原来的扩展名为“.c”的文件,但是原来的文件仍然保留,只是执行过程中的实际文件发生了改变。(这里所说的替换并不是指原来的文件被删除)
2、汇编阶段:
插入汇编语言程序,将代码翻译成汇编语言。编译器首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,编译器把代码翻译成汇编语言,同时将扩展名为“.i”的文件翻译成扩展名为“.s”的文件。
3、编译阶段:
将汇编语言翻译成机器语言指令,并将指令打包封存成可重定位目标程序的格式,将扩展名为“.s”的文件翻译成扩展名为“.o”的二进制文件。
4、链接阶段:
在示例代码中,改代码文件调用了标准库中printf函数。而printf函数的实际存储位置是一个单独编译的目标文件(编译的结果也是扩展名为“.o”的文件),所以此时主函数调用的时候,需要将该文件(即printf函数所在的编译文件)与hello world文件整合到一起,此时链接器就可以大显神通了,将两个文件合并后生成一个可执行目标文件。
2. jdk动态代理可以代理final方法吗
jdk动态代理不可以代理final方法。在JDK的动态代理中,无法直接通过动态代理来代理final方法。JDK动态代理是基于接口的代理,它使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口实现代理。在JDK动态代理中,代理对象必须实现至少一个接口,然后通过代理对象调用接口中的方法。由于final方法是不能被子类重写的,因此无法在接口中定义一个final方法,因此动态代理无法直接代理final方法。如果尝试将final方法定义在接口中,编译时将会报错。值得注意的是,目标类中存在非final的方法,动态代理仍然可以代理这些方法。但是,对于继承自final类的方法或者直接定义为final的方法,动态代理是无法直接代理的。JDK动态代理是Java提供的一种代理机制,利用反射机制在运行时动态生成代理类对象,并通过代理类来间接访问目标对象的方法。