java运行原理、静态代理和动态代理区分


1、java的编译和运行原理:
■ 编译:将源文件 .java 文件,通过编译器(javac 命令) 编译成 字节码文件 .class 文件。
■ 运行,通过类加载器(以二进制流形式)把字节码加载进JVM,通过java解析器(java 命令) 进行运行程序。
先将java源文件进行编译生成字节码文件,然后通过类加载器ClassLoader (以二进制流形式) 加载进虚拟机,然后通过java解析器或即使编译器进行运行。
java运行原理、静态代理和动态代理区分
文章图片




2、静态代理和动态代理:
■ 静态代理:(经历了编译和运行) 在程序运行前就已经存在代理类的字节码文件(因为通过了编译阶段),代理对象和真实对象的关系在运行前就确定了(因为通过了编译阶段)。

■ 动态代理:(只经历了运行,咱通过某种手段得到的字节码【遵循字节码格式和结构】) 动态代理类是在程序运行期间由jvm通过反射等机制动态生成的,所以不存在代理类的字节码文件(因为没有经历编译阶段),代理对象和真实对象的关系是在程序运行期间才确定的。

● 如何动态创建一份字节码?(实现了在代码中动态创建一个类的能力) 通过java的编译和运行原理,可以看到:在运行时期,是jvm通过字节码的二进制信息来加载类的。
【java运行原理、静态代理和动态代理区分】所以,当我们在运行时期,通过java编译系统组织.class文件的格式和结构,生成相应的二进制数据,然后再把这个二进制数据加载转换成对应的类。

    推荐阅读