动态代理

来源:互联网 发布:长沙学历网络教育报名 编辑:程序博客网 时间:2024/06/05 02:17

增强一个类的方法有三种办法
1:继承 ————能够控制这个类的构造
2:装饰者模式——增强的类和被增强的类实现相同的接口,增强的类中获得被增强的类的引用, 缺点是接口中方法过多,只增强某个方法其他方法也要重写
3:动态代理———被增强的类实现了接口

代理的概述:
—–代理 , 实现接口, 本来能做的事 代理也能做还能增强
JDK的代理 Proxy
Object obj = (Object)Proxy.newProxyInstance(Object.class.getClassLoader,new Class[]{Object.class},hander);
三个参数分别是:类的加载器 , 被增强的类实现的所有接口 , 关键是第三个参数 InvocationHandler , 这是一个接口 , 得自己去实现

//接口public interface Waiter {    void serve();    String sayhello(String name);}
//实现类public class Waitress implements Waiter {    @Override    public void serve() {        System.out.println("服务中... ...");    }    @Override    public String sayhello(String name) {        return "hello"+name;    }}
//增强实现    @Test     public void demo1(){        final Waiter waiter = new Waitress();//        waiter.serve();        ClassLoader classLoader = waiter.getClass().getClassLoader();        Class[] interfaces = waiter.getClass().getInterfaces();        Waiter waiter1 = (Waiter)Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {            @Override            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                System.out.println("weixiao");                Object invoke = method.invoke(waiter, args);                return invoke;            }        });//        waiter1.serve();        String 张三 = waiter1.sayhello("张三");        System.out.println(张三);    }}