什么是动态编程
动态编程是相对于静态编程而言的,平时我们讨论比较多的静态编程语言例如Java,与动态编程语言例如JavaScript相比,二者有什么明显的区别呢?简单的说就是在静态编程中,类型检查是在编译时完成的,而动态编程中类型检查是在运行时完成的,所谓动态编程就是绕过编译过程在运行时进行操作的技术。
动态编程使用场景
1. 通过配置生成代码,减少重复编码,降低维护成本。
2. AOP的一种实现方式,方便实现性能监控和分析,日志,事务,权限校验等。
3. 实现新语言的语义,例如Groovy使用ASM生成字节码。
4. 单元测试中动态mock测试依赖。
Java动态编程方式
反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造,并生成其对象实体、或对其fields设值、或唤起其methods。
代码片段动态代理
目前java动态代理的实现分为两种:基于JDK的动态代理和基于CGILB的动态代理。在业务中使用动态代理,一般是为了给需要实现的方法添加预处理或者添加后续操作,但是不干预实现类的正常业务,把一些基本业务和主要的业务逻辑分离。我们一般所熟知的Spring的AOP原理就是基于动态代理实现的。
基于JDK的动态代理就需要知道两个类:1.InvocationHandler(接口)、2.Proxy(类),还要知道JDK是基于接口的动态代理,因为基于JDK的动态代理一定要继承一个接口,而绝大部分情况是基于POJO类的动态代理,那么CGLIB就是一个很好的选择。
代码片段动态编译
动态编译是从Java 6开始支持的,主要是通过一个JavaCompiler接口来完成的。通过这种方式我们可以直接编译一个已经存在的java文件,也可以在内存中动态生成Java代码,动态编译执行。
代码示例调用Java Script引擎
Java 6加入了对Script(JSR223)的支持。ScriptEngineManager 是一个脚本框架,提供了让脚本语言来访问Java内部的方法。你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本,这个脚本API允许你为脚本语言提供Java支持。
代码片段动态生成字节码
操作java字节码的工具有BECL/ASM/CGLIB/Javassist,其中有两个比较流行的,一个是ASM,一个是Javassist。ASM直接操作字节码指令,执行效率高,要求使用者掌握Java类字节码文件格式及指令,对使用者的要求比较高。Javassist提供了更高级的API,执行效率相对较差,但无需掌握字节码指令的知识,对使用者要求较低。
代码片段OGNL
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。这样可以更好的取得数据。
代码片段Groovy
Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,拥有类似Python、Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用,能够与Java 代码很好地结合,也能用于扩展现有代码。同样也是在java虚拟机(JVM)上运行的一门语言,当然也是面向对象的一个成熟的语言,但是又可以当做纯碎的脚本语言,代码量少,具有与闭包和动态语言的特性。
代码片段
网友评论