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

Posted zhangchiblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态代理是基于什么原理(总结杨晓峰的博客)相关的知识,希望对你有一定的参考价值。

动态代理的原理

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

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

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

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

 


 

以上是关于动态代理是基于什么原理(总结杨晓峰的博客)的主要内容,如果未能解决你的问题,请参考以下文章

java面试题(杨晓峰)---以面试题为切入点,有效提升你的java内功

Spring aop 基于JDK动态代理和CGLIB代理的原理以及为什么JDK代理需要基于接口

Spring aop 基于JDK动态代理和CGLIB代理的原理以及为什么JDK代理需要基于接口

杨老师课堂之springAOP事务控制源码解析

Java -- 每日一问:动态代理是基于什么原理?

Java 动态代理是基于什么原理(还没整理完)