动态代理是基于什么原理(总结杨晓峰的博客)
动态代理的原理
编程语言分为:动态类型,静态类型
动态类型和静态类型的区别?
一种比较简单的区别方法:是在编译期进行检查,还是在运行时期进行检查。
通常认为:java是一种强类型语言,但是提供类似反射的机制,也具备部分动态语言的能力。
反射机制是java语言提供的一种基础功能,赋予程序在运行时自省(introspect能力),通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性或者方法,调用方法或者构造对象,甚至可以运行时修改类定义。
动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制。
实现动态代理的方式有很多:比如jdk自身提供的动态代理,性能更高的字节码操作机制,类似ASM、cglib(基于ASM),Javassist
jdk动态代理的实例
public class MyDynamicProxy{ public static void main(String[] args) { HelloImpl hello = new HelloImpl(); MyInvocationHandler handler = new MyInvocationHandler(hello); //构造代码实例 Hello proxyHello = (Hello)Proxy.newProxyInstance(HelloImpl.class.getClassLoader(),HelloImpl.class.getInterfaces(),handler); //调用代理方法 proxyHello.sayHello(); } interface Hello{ void sayHello(); } class HelloImpl implements Hello{ @Override public void sayHello(){ System.out.println("Hello world"); } } class MyInvocationHandler implements MyInvocationHandler{ private Object target; public MyInvocationHandler(Object target){ this.target = target; } @Override public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{ System.out.println("Invoking sayHello"); Object result = method.invoke(target,args); return result; } } }