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动态代理的简单例子,但往往简单都是最经典的,基础打好,框架学习才不会那么吃力。
技术可以发展成为一种艺术。
一、动态代理的作用:有这样一种需求:我们现在有一个类,类里面有一个方法,要求我们在不改变这个类的源代码的情况下,为这个方法前后增加一些处理(比如:日志处理,事务处理,权限处理等),我们该如何办呢?这个时候,我们就需要为这个类生成一个代理类(静态代理和动态代理),由这个代理类为原类服务。
二、 问题准备:
接口:机动车类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动态代理的简单例子,但往往简单都是最经典的,基础打好,框架学习才不会那么吃力。
技术可以发展成为一种艺术。
相关文章推荐
- Java关键字final、static使用总结
- java 函数形参传值和传引用的区别
- 用JAVA 查询 Active Directory(AD)
- 用JAVA 查询 Active Directory(AD)
- java基础--基本数据类型
- 【Java】创建文件夹
- 学习JAVA的步骤
- 【Spring-AOP-学习笔记-3】@Before前向增强处理简单示例
- springMVC注解@initbinder
- eclipse中如何调整字体大小?
- Struts框架的工作原理
- Java中重载与重写(覆盖)的区别
- Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误)
- Ubuntu 14.04 安装 JDK 8,ubuntu14.04
- Java内存区域
- 【Java】编写函数,检查链表是否为回文
- 关于spring security自定义sessionRegistry不工作的原因简析
- 【Java】给定一个有环链表,实现算法返回环路的开头结点
- java新框架JFinal来啦!你还是只知道SSH框架吗?
- 论java虚拟类和接口的区别