动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。
动态代理最大的特点就是没有代理类
动态代理有两种实现方式,CGLib与jdk,这里用的是jdk实现动态代理
就静态代理举个栗子
故事背景
有两个人,有很多money的张三和24K纯屌丝李四,他们做着做同样的事情——惹上了官司和吃饭,张三就雇用专业的律师打官司,饭自己吃;李四雇不起律师,只好自己上,饭当然也是要自己吃……用动态代理实现如下
接口
package com.hk.service; /** * 定义一个接口(一类人要做的事情) * @author 浪丶荡 * */ public interface ISomeService { //打官司 public String Litigate(); //吃饭 public String eat(); }
目标类
package com.hk.service; /** * 目标类 * @author 浪丶荡 * */ public class ISomeServiceImp implements ISomeService { @Override public String Litigate() { return "自己打官司,输了"; } @Override public String eat() { return "自己吃饭"; } }
测试方法
package com.hk.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import com.hk.service.ISomeService; import com.hk.service.ISomeServiceImp; public class MyTest { public static void main(String[] args) { //有money人张三 final ISomeService zhangsan = new ISomeServiceImp(); //屌丝李四 ISomeService lisi = new ISomeServiceImp(); //张三请的律师打官司,饭自己吃 ISomeService sp = (ISomeService) Proxy.newProxyInstance( zhangsan.getClass().getClassLoader(), //目标类的类加载器 zhangsan.getClass().getInterfaces(), //目标类所实现的所有接口 new InvocationHandler() { //匿名内部类 /** * proxy 代理对象 * method 目标方法(代理的业务) * args 目标方法的参数列表 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.toString().contains("eat")){//吃饭就不用律师代劳了,自己来 return (String)method.invoke(zhangsan, args);//反射,调用张三的方法; } return "律师打官司,赢了"; } }); System.out.println("zhangsan"+sp.Litigate()+"-----"+sp.eat()); //苦逼的李四自己打官司,自己吃饭 System.out.println("lisi"+lisi.Litigate()+"-----"+lisi.eat()); } }
结果
zhangsan律师打官司,赢了-----自己吃饭 lisi自己打官司,输了-----自己吃饭