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");
}
}
在使用时,我们不再直接使用 TestImpl1或TestImpl2,而使用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