Java设计模式之动态代理

关于Proxy:

1,他是所有动态代理的父类;

2,他可以用作创建动态代理类和动态代理对象;

3,JDK中自带的动态代理。

1,首先创建一个接口,方法申明如下:

package com.proxy;

public interface IDog {
    public void bark();
    public void guard();
    
}

2,再创建需要代理的类,并且实现上面的接口:

package com.proxy;


public class ADog implements IDog{

    @Override
    public void bark() {
        System.out.println("卖萌");
    }

    @Override
    public void guard() {
        System.out.println("耍宝");
    }

}

3,首先创建一个动态代理类,并且实现invocationHandler,具体代码如下:



package com.proxy;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;


public class DogHandler implements InvocationHandler{
IDog Dgod ;
public DogHandler() {
}
public DogHandler(IDog dog) {
this.Dgod = dog;
}
/**重写了invactionHandler的方法
*参数发疯别为:被代理对象 需要调用的方法 方法中的参数
*方法传进去后,利用反射调用方法
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始");
method.invoke(Dgod, args);
System.out.println("结束");
return null;
}

}

 

4,写道此处动态代理就完成了,下面i进入测试阶段;代码如下


package com.proxy;


import java.lang.reflect.Proxy;


public class Client {
public static void main(String[] args) {
//创建一个真实对象,用作实参传入DogHandler方法(处理器方法)
IDog dog = new ADog();
//创建处理器对象
DogHandler handler = new DogHandler(dog);
//利用Proxy.newProxyInstance方法创建代理对象,并且把对应的参数传入
//注意
IDog proxy = (IDog)Proxy.newProxyInstance(dog.getClass().getClassLoader(), dog.getClass().getInterfaces(), handler);
//调用方法
proxy.bark();
}
}

 

优点:由于每次调用代理对象的方法都会调用public Object invoke(Object proxy, Method method, Object[] args)方法,所以可以在此方法中调用一些重复性较高的代码,以此提高代码的可读性和可维护性。

原文地址:https://www.cnblogs.com/hunt1coder/p/10732706.html