您的位置:首页 > 编程语言 > Java开发

JDK的动态代理

2015-07-09 15:51 633 查看
动态代理应用非常广泛,本节只叙述JDK的动态代理的使用。关于JDK动态代理的源码分析以及在Spring上的运用,将随后介绍。

一、动态代理的作用:有这样一种需求:我们现在有一个类,类里面有一个方法,要求我们在不改变这个类的源代码的情况下,为这个方法前后增加一些处理(比如:日志处理,事务处理,权限处理等),我们该如何办呢?这个时候,我们就需要为这个类生成一个代理类(静态代理和动态代理),由这个代理类为原类服务。

二、 问题准备:

接口:机动车类Vehicle.java

public interface Vehicle {
public void run(int speed);
}
实现接口的类:公交车类Bus.java

public class Bus implements Vehicle {

@Override
public void run(int speed) {

System.out.println("公共汽车正在跑,速度为:" + speed + "km/h");
}
}

我们需要做的是在Bus类中的run方法内部的前后增加处理。

三、静态代理:

代理类:VehicleProxy.java

public class VehicleProxy implements Vehicle {

private Vehicle vehicle;

public VehicleProxy(Vehicle vehicle) {
super();
this.vehicle = vehicle;
}

@Override
public void run(int speed) {
System.out.println("启动时加速。。。");
vehicle.run(speed);
System.out.println("停止时减速。。。");
}
}

测试类:

public class TestProxy {
public static void main(String[] args) {

Vehicle vehicle = new Bus();

VehicleProxy vehicleProxy = new VehicleProxy(vehicle);

vehicleProxy.run(100);

}

}
结果:

启动时加速。。。
公共汽车正在跑,速度为:100km/h
停止时减速。。。

四、静态代理弊端:

扩展性不好,我们每代理一个类,就要写一个代理类,类会越来越多。

五、动态代理:

JDK的动态代理会使用jdk中的两个重要的类:Proxy类和InvocationHandler类。

代理类:VehicleInvacationHandler.java 需要实现InvocationHandler接口

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

public class VehicleInvacationHandler implements InvocationHandler {

// 被代理类的实例对象
Object any_Object;

public VehicleInvacationHandler(Object any_Object) {
super();
this.any_Object = any_Object;
}

@Override
public Object invoke(Object arg0, Method arg1, Object[] arg2)
throws Throwable {

System.out.println("启动时加速。。。");

Object vehiclMehtod = arg1.invoke(any_Object, arg2);

System.out.println("停止时减速。。。");

return vehiclMehtod;
}

// 返回代理类的实例
public Object getProxyClassInstance(){

Object proxyObject =
Proxy.newProxyInstance(any_Object.getClass().getClassLoader(), any_Object.getClass().getInterfaces(), this);

return proxyObject;
}
}

在该代理类中我们没有发现任何与所给题目有关的信息(Vehicle接口)。

测试类:TestProxy.java

public class TestProxy {
public static void main(String[] args) {
Vehicle vehicle = new Bus();
VehicleInvacationHandler vehicleInvocationHandler = new VehicleInvacationHandler(vehicle);
Vehicle vehicleProxy = (Vehicle)vehicleInvocationHandler.getProxyClassInstance();
vehicleProxy.run(100);
}
}

结果:

启动时加速。。。

公共汽车正在跑,速度为:100km/h
停止时减速。。。
六、总结

这是一个使用JDK动态代理的简单例子,但往往简单都是最经典的,基础打好,框架学习才不会那么吃力。

技术可以发展成为一种艺术。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: