环境:QQ类继承Car类
需求:对QQ的run方法加强
Car 类
package proxy; public interface Car { public void run(); public void stop(); }
QQ类
package proxy; public class QQ implements Car { @Override public void run() { System.out.println("qq开车"); } @Override public void stop() { System.out.println("qq停车"); } }
实现:使用代理对run方法加强
1、静态代理
package proxy; /** * * 静态代理使用装饰着模式实现 * * 分析: * A.要求被装饰者和装饰者实现同一个接口或者继承同一个类 * B.在装饰者中要有被装饰者的引用 * C.对需要加强的方法进行加强 * D.对不需要加强的方法调用原来的方法 * * @author 61423 * */ public class QQStaticProxy implements Car{ QQ qq = new QQ(); @Override public void run() { System.out.println("QQ加油"); qq.run(); System.out.println("QQ加速"); } @Override public void stop() { qq.stop(); } public static void main(String[] args) { QQStaticProxy qqStaticProxy = new QQStaticProxy(); qqStaticProxy.run(); } }
2、动态代理
package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * * 动态代理: 程序运行的时候创建实例,对被代理对象进行加强 * 1、jdk中Proxy类,前提:实现InvocationHandler接口 * 2、spring中cglib,前提:继承类 * * Object Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) * 参数说明: * ClassLoader:代理对象类加载器 一般我们使用的是被代理对象的类加载器 * Class[]:代理对象需要实现接口 一般我们使用的是被代理对象所实现的所有接口 * InvocationHandler:执行处理类.在这里面对方法进行加强 * * invocationHandler中只有一个方法 * Object invoke(Object proxy, Method method, Object[] args) * 参数说明: * proxy:代理对象 * method:当前执行的方法 * args:当前方法执行的时候所需要的参数 * 返回值:就是当前method对象执行的返回值 *实现步骤: * A:调用Proxy.newProxyInstance(); * B:实现InvocationHandler接口,在该接口中强化被代理对象的方法 * * @author 61423 * */ public class QQProxy { public static void main(String[] args) { QQ qq = new QQ(); // QQ的代理的对象 Car qqProxy = (Car)Proxy.newProxyInstance(QQ.class.getClassLoader(), new Class [] {Car.class}, new InvocationHandler() { /** * 相当于被代理的方法,返回被代理的方法返回的值 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 仅对QQ的run方法进行代理 if("run".equals(method.getName())) { System.out.println("充氮气"); Object obj = method.invoke(qq, args); System.out.println("加速"); return obj; } return method.invoke(qq, args); } }); qqProxy.run(); // qqProxy.stop(); } }