设计模式(二) 动态代理

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