java代理机制

2020-09-18  本文已影响0人  baifanger

一、代理模式介绍

代理是一种设计模式,主要用于在我们访问目标对象时,在不修改目标对象的前提下,可以对目标对象提供的功能进行一定的扩展。
代理可分为静态代理、动态代理以及三方库 cblib代理

二、静态代理

这种代理需要额外写一个代理类,和目标对象实现一样的接口。
优点:实现方式简单,易理解
缺点:
1.代码冗余,需要额外生成代理类
2.不易维护,一旦接口有变化,代理类和目标对象都需要改动
举例:
接口类:I

public interface ITest {
    public void test();
}

实现类

public class TestImpl1 implements ITest {
    @Override
    public void test() {
        Log.i("test","test1");
    }
}

public class TestImpl2 implements ITest {
    @Override
    public void test() {
        Log.i("test","test2");
    }
}

代理类

public class TestProxy implements ITest {
    private ITest target;

    public TestProxy(ITest test) {
        target = test;
    }

    @Override
    public void test() {
        Log.i("test", "before");
        target.test();
        Log.i("test", "after");
    }
}

在使用时,我们不再直接使用 TestImpl1TestImpl2,而使用TestProxy对象,并将目标对象传入TestProxy中,在调用目标对象前后,增加一些相应的处理,以达到代理的目的。

三、动态代理

从上述代码中,我们能明显看到静态代理在开发及维护上的弊端,因此有了动态代理。
静态代理是编译时根据我们写的代码生成.class文件来实现的,而动态代理则不一样,它是在程序运行时动态生成相应的.class文件
动态代理类

public class TestProxyFactory {
    private ITest target;

    public TestProxyFactory(ITest test) {
        target = test;
    }

    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 {
                Log.i("test", "before");
                method.invoke(target, args);
                Log.i("test", "after");
                return null;
            }
        });
    }
}

从上述动态代理代码可以看出,不再需要我们额外的写代理类了,随后目标类有任何的功能增减,都不会影响其他代码

四、cglib

这是三方提供的一个类库,具体我也没用过,这里只是给大家普及一下知识点,从上面动态代理可以看出,其需要依赖于一个接口,而cblib最大的优点是不再依赖于接口.具体的用法大家就自己研究了。

关于动态代理生成的$proxy0类的代码,参照以下:https://blog.csdn.net/zhao_zepeng/article/details/55050627

上一篇 下一篇

猜你喜欢

热点阅读