首页 > 其他 > 详细

Jdk动态代理个人简单梳理

时间:2021-02-01 14:49:32      阅读:27      评论:0      收藏:0      [点我收藏+]

java动态代理在Spring的AOP中可谓是被应用到了极致,一直不是很清楚,今天想复习一下设计模式,刚好看到动态代理一下就把我的思绪拉回到看AOP源码的时光了,说实话动态代理我用的太少了,于是今天小总结一下,来看看。

引入如下场景:房东想租房子,但是他只想租不想管其余的琐事,于是他找中介,把房子托给他,这个中介就是一个代理者。

静态代理,十分简单:就是代理者内部聚合一个接口,这个接口是房东和中介共有的,这样就实现了静态的代理,这里就不再赘述了,代码贴出来看一眼就懂了。

// 被代理类和代理类共同的操作
interface Action {
    default void doOther() {
    };

    void display();
}
// 被代理类【房东】
class Host implements Action {

    @Override
    public void display() {
        System.out.println("我是房东,我只想租房子,啥也不想管");
    }
}
// 代理类【中介】
class HostProxy implements Action {
    private Action action;

    public HostProxy() {
        action = new Action() {
            @Override
            public void display() {
                System.out.println("do nothing...");
            }
        };
    }

    public HostProxy(Action action) {
        this.action = action;
    }

    @Override
    public void display() {
        PostProcessorsBeforeAction();
        action.display();
        PostProcessorsAfterAction();
    }

    private void PostProcessorsBeforeAction() {
        System.out.println("我来代理你做吧");
    }

    private void PostProcessorsAfterAction() {
        System.out.println("代理执行后序到结束");
    }
}

动态代理:

// 动态代理雏形...
Action host = new Host();
InvocationHandler invocationHandler = new InvocationHandler() {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("动态代理之前干事情");
        host.display();
        System.out.println("动态代理完成");
        return null;
    }
};
Action actionProxy = (Action) Proxy.newProxyInstance(Action.class.getClassLoader(), new Class[]{Action.class}, invocationHandler);
actionProxy.display();

个人写动态代理【简单版,有时间继续探讨】:

// 自己写一下动态代理
class DynamicProxy<T> {
    public T getProxy(Class<?> clazz, T obj, Object... args){
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("动态代理之前干的...事情");
                // 原方法调用(这里只测试有一个方法,我取出第一个就好)
                Method[] methods = obj.getClass().getMethods();
                methods[0].invoke(obj, args);
                System.out.println("动态代理完成啦...");
                return null;
            }
        };
        T proxyInstance = (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, invocationHandler);
        return proxyInstance;
    }
}
// 动态代理
DynamicProxy<Action> dynamicProxy = new DynamicProxy();
Action proxy = dynamicProxy.getProxy(Action.class, new Host());
proxy.display();

一篇很好的文章,值的看看:https://www.cnblogs.com/gonjan-blog/p/6685611.html

Jdk动态代理个人简单梳理

原文:https://www.cnblogs.com/ningxinjie/p/14356058.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!