动态代理是基于什么原理(总结杨晓峰的博客)

动态代理的原理

编程语言分为:动态类型,静态类型

动态类型和静态类型的区别?

一种比较简单的区别方法:是在编译期进行检查,还是在运行时期进行检查。

通常认为: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;
        }
    }
}

 


 

posted on 2018-05-17 17:21  张小泽的小号  阅读(759)  评论(0编辑  收藏  举报

导航