动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。
动态代理最大的特点就是没有代理类
动态代理有两种实现方式,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自己打官司,输了-----自己吃饭