17.java动态编程总结(反射、动态编译、脚本引擎、字节码操
作)
概述
什么是动态编程?动态编程解决什么问题?Java中如何使⽤?什么原理?如何改进?(需要我们⼀起探索,由于⾃⼰也是⽐较菜,⼀般深⼊不到这个程度)。
mvc和三层架构的理解什么是动态编程
动态编程是相对于静态编程⽽⾔的,平时我们讨论⽐较多的就是静态编程语⾔,例如Java,与动态编程语⾔,例如JavaScript。那⼆者有什么明显的区别呢?简单的说就是在静态编程中,类型检查是在编译时完成的,⽽动态编程中类型检查是在运⾏时完成的。所谓动态编程就是绕过编译过程在运⾏时进⾏操作的技术,在Java中有如下⼏种⽅式:
反射
由于Java执⾏过程中是将类型载⼊虚拟机中的,所以我们就可以在运⾏时动态获取到所有类型的信息然后做相应的操作(注意:只能获取却不能修改类的信息)
动态编译
动态编译是从Java 6开始⽀持的,主要是通过⼀个JavaCompiler接⼝来完成的。通过这种⽅式我们可以在程序运⾏中直接编译⼀个已经存在的java⽂件,也可以在内存中动态⽣成Java代码,动态编译执⾏。
Java脚本引擎
以javascript为例,Java 6加⼊了对Script(JSR223)的⽀持。这是⼀个脚本框架,提供了让脚本语⾔来访问Java内部的⽅法。你可以在运⾏的时候到脚本引擎,然后调⽤这个引擎去执⾏脚本。这个脚本API允许你在Java中调⽤其他脚本语⾔。
动态⽣成字节码
这种技术通过操作Java字节码的⽅式在JVM中⽣成新类或者对已经加载的类动态添加元素。
动态编译与动态⽣成字节码:这两种⽅法⽐较相似,原理也都是利⽤了Java的设计原理,存在⼀个虚拟机执⾏字节码,这就使我们在此处有了改变字节码的操作空间。
动态编程解决什么问题
在静态语⾔中引⼊动态特性,主要是为了解决⼀些使⽤场景的痛点。其实完全使⽤静态编程也办的到,只是付出的代价⽐较⾼,没有动态编程来的优雅。例如依赖注⼊框架Spring使⽤了反射,⽽Dagger2 却使⽤了代码⽣成的⽅式(APT)。
例如
1: 在那些依赖关系需要动态确认的场景:
2: 需要在运⾏时动态插⼊代码的场景,⽐如动态代理的实现。
3: 通过配置⽂件来实现相关功能的场景
总结
有关动态编程的知识在平时的应⽤层使⽤不是特别多,多是⽤在构建框架。例如Spring框架使⽤反射来构建,⽽⽤于AOP编程的动态代理则多是采⽤⽣成字节码的⽅式,例如JBoss,Spring中的AOP部分。了解这部分知识可以在⽇后遇到相关问题时⽐别⼈多⼀条思考的思路也是好的,做⼀个思路开阔的Developer。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。