Java中的动态代理
一.什么是动态代理
动态代理其实就是一种设计模式,使用这种方法可以简化一些编程。
用一个具体的例子来讲:
代理通过名字就能听的出来,就是把一些步骤交给地方去做,比如,你要住房子,你可以把找房子,打扫卫生都代理给一个中介帮忙做,这样你只需要提包入住就行了。同样比如开车,你可以把启动车辆和停止车辆交个一个代理,这样你所需要做的就只是驾驶了。所以使用代理技术就相当于把一些重复相同的功能交给一个专门的处理程序处理,这样我们只需要关心核心功能就行了。
二.怎么在Java中使用代理模式
Java中提供好了一个专门进行代理处理的类叫做Proxy,我们使用这个类就可以很方便的进行代理的开发。
就使用上面那个汽车的例子。
2.1 首先我们要写一个汽车接口,因为汽车不止一种
public interface Car {
//汽车具有跑的功能,但是没有启动和停止,启动和停止交给代理
public void run();
}
2.2 然后在写一个汽车的实现类
在实现类中写具体的汽车run的方法。
public class FastCar implements Car{
@Override
public void run(){
System.out.println("Fast run...");
}
}
2.3写动态代理工厂
//实现InvocationHandler不是必须的,因为下面代理创建的时候需要一个处理器,所以直接使用this(就是把这个类把InvocationHandler实现了,免得再写一个)
public class ProxyFactory implements InvocationHandler{
//因为实现了InvocationHandler,所以在下面invoke的时候,需要给出具体的接口
private Car car;
//为了给car赋值
public ProxyFactory(Car car) {
super();
this.car = car;
}
public Car getCarProxy() {
//创建代理car 其中第一个是代理的类加载器,第二个是要实现的所有类的接口数组,第三个是处理器(可以看做是代理者,他帮你处理开车..)
Car car = (Car)Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(), FastCar.class.getInterfaces(), this);
return car;
}
//处理器类要实现该函数
@Override
public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable {
//代理的内容
System.out.println("开启车辆");
//这个就是开始自己的方法(反射技术。第一个参数就是上面声明的一个car,第二个是函数参数列表)
method.invoke(car, arg2);
System.out.println("停止车辆");
//invoke函数反射的函数的返回值
return null;
}
}
这里我把处理器类和动态的代理工厂写在了一起。
其实从上面的代码可以看出,主要的部分就是invoke的部分,其中method.invoke(car, arg2);就是使用了反射,可以主动的去调用相应的方法,而在这行代码之前或者之后,我们可以让做一些其他事情,实现代理完成。
2.4测试
public class test {
public static void main(String[] args) {
Car car = new FastCar();
//对这个car进行代理
car = new ProxyFactory(car).getCarProxy();
//使用代理过的car运行
car.run();
}
}
运行结果:
开启车辆
Fast run...
停止车辆
总结:
代理模式中其实也是使用了反射的方法来实现的,在反射这个函数之前先进行一些代理代码,然后使用反射调用该类的相应方法就ok了。