先定义一个公共的接口
public interface SalaComputer { public abstract String sala(double money); public abstract void show(); }
一个真实对象
/** * 真实类 */ public class Lenovo implements SalaComputer { @Override public String sala(double money) { System.out.println("花了8000元买了一台联想电脑"); return "联想电脑"; } @Override public void show() { System.out.println("展示电脑....."); } }
此处不再演示真实类调用方法了,直接上动态代理
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyTest { public static void main(String[] args) { //1.创建真是对象 Lenovo lenovo = new Lenovo(); //2.动态代理增强Lenovo对象 /* 三个参数: 1.类加载器,真是对象.getClass().getClassLoader() 2.接口数组:真是对象.getClass().getInterfaces() 3.处理器:new InvocationHandler(){} * 要和真实对象保持一致,因为要代理 真实对象 */ SalaComputer proxy_lenovo = (SalaComputer)Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() { /** * 代理逻辑编写的方法,代理对象调用的所有方法都会触发该方法 * * 参数含义:(代理对象和真实对象是一样的,只是对真实对象进行了增强,调用的还是真实对象的方法,参数) * * Object proxy:就是真实对象, * * Method method:调用的方法 * * Object[] args:所传递的参数 * 返回值,就是所调方法经过增强后的返回值 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("该方法被执行了..."); //判断是否是sala方法 if(method.getName().equals("sala")){ //z增强参数 double money = (double) args[0]; money = money * 0.85; System.out.println("专车接你......"); //使用 真实对象调用方法 String invoke = (String)method.invoke(lenovo, money); System.out.println("免费送货........."); //增强返回值 return invoke+"_鼠标垫"; }else{ Object obj = method.invoke(lenovo, args); return obj; } } }); //3.调用方法 String computer = proxy_lenovo.sala(8000); System.out.println(computer); proxy_lenovo.show(); } }
执行结果
增强servlet的request