设计模式(二) 动态代理

it2022-05-05  154

1.1、动态代理

      在程序运行时,运用反射机制在内存中动态创建代理对象,其实现的功能是与静态代理的功能是类似的,都是增强目标对象额外的功能操作,扩展目标对象。只不过是实现的方法不一致而已。

1.2、动态代理实现的要求

      1代理对象,不需要实现与目标一样的接口;

 

      2)代理对象的生成,是利用JDKAPI 动态的在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型);

 

      3)  动态代理, JDK代理或者接口代理;

 

      JDK中生成代理对象的APIProxy 

 

              static Object newProxyInstance(

 

               ClassLoader loader,        指定当前目标对象使用类加载器(一般使用默认)

 

               Class<?>[] interfaces,     目标对象实现的接口的类型

 

              InvocationHandler h         事件处理器(在此添加对目标对象实现功能的扩展)

 

            )  

代码实现如下:

 

 新建一个接口:IUserDao

 

public interface IUserDao { //接口对象 public void save();//保存用户 }

 

 目标对象:UserDao public class UserDao implements IUserDao { //目标对象 @Override public void save() { System.out.println("保存用户"); } }

工厂代理对象:ProxyFactory  可以实现对所有类的代理。

 

public class ProxyFactory { private Objects target; public ProxyFactory(Objects target) { this.target = target; } // 给目标对象返回代理对象 public Object getProxyInstance(){ return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("日志打印---开始---"); Object roxyObject = method.invoke(target,args); System.out.println("日志打印---结束---"); return roxyObject; } }); } }

 

结果:

 

动态代理总结:

    代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理!

思考:

        有一个目标对象,想要功能扩展,但目标对象没有实现接口,怎样功能扩展?点击此处查看cglib实现

 

 

转载于:https://www.cnblogs.com/yuanchaoyong/p/6413571.html


最新回复(0)