JDK动态代理和静态代理
摘抄自简书大佬博客的一部分
一、静态代理
JAVA静态代理是指由程序员创建或工具生成的代理类,这个类在编译期就已经是确定了的,存在的。
典型的静态代理模式一般包含三类角色:
1.抽象角色:它的作用是定义一组行为规范。抽象角色一般呈现为接口(或抽象类),这些接口(或抽象类)中定义的方法就是待实现的。
2.真实角色:实现了抽象角色所定义的行为。真实角色就是个普通的类,它需要实现抽象角色定义的那些接口。
3.代理角色:代表真实角色的角色。根据上面代理的定义,我们可以知道代理角色需要至少完成(或实现)真实角色的功能。为了完成这一使命,那么代理角色也需要实现抽象角色所定义的行为(即代理类需要实现抽象角色所定义的接口),并且在实现接口方法的时候需要调用真实角色的相应方法。
简单理解
自己理解的来说,静态代理就是为每个需要被代理的类(接口)提供一个代理对象,调用真实的被代理对象的实现类,来实现相应的方法。
二、JDK动态代理
JDK动态代理的实现是在运行时,根据一组接口定义,使用Proxy、InvocationHandler等工具类去生成一个代理类和代理类实例。
JDK动态代理的类关系模型和静态代理看起来差不多。也是需要一个或一组接口来定义行为规范。需要一个代理类来实现接口。区别是没有真实类,因为动态代理就是要解决在不知道真实类的情况下依然能够使用代理模式的问题。
简单理解
自己理解的来说,动态代理就是在代理类内部,不需要知道具体是哪个对象要被代理,全用泛型和反射来代替实现代码,达到实现被代理对象的方法实现。也就是说可以依靠反射机制,实现被代理对象的方法。