基於JDK的動態代理
阿新 • • 發佈:2018-11-20
- 代理模式是GOF提出的23種設計模式中最為經典的模式之一,代理模式是物件的結構模式,它給某一個物件提供一個代理物件,並由代理物件控制對原物件的引用。簡單的說,代理物件可以完成比原物件更多的職責,當需要為原物件新增橫切關注功能時,就可以使用原物件的代理物件。
- 下面是一個簡單的入門案例
①先寫一個介面 並且實現這個介面
public interface UserService {
void add();
String delete();
}
public class UserServiceImpl implements UserService{ @Override public void add() { System.out.println("add....."); } @Override public String delete() { System.out.println("delete....."); return "delete"; } }
②寫一個MyProxy類
public class MyProxy implements InvocationHandler{ private Object target; //Proxy是反射包下的Proxy(java.lang.reflect.Proxy;),核心方法是newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)方法 //第一個引數為得到目標物件的類載入器 //第二個引數為得到這個類的介面 //第三個引數是你要增強的方法,可以在這了寫一個類 ,我圖方便所以寫了this,這個類要實現InvocationHandler介面重寫invoke方法 public Object getProxy(Object target) { this.target=target; return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this); } //這些方法可以新建一個類實現 InvocationHandler 介面這樣耦合度更低 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName();//可以獲得方法的名字 if("add".equals(methodName)) { System.out.println("add方法加強了"); }else if("delete".equals(methodName)){ System.out.println("delete方法加強了"); } Object invoke = method.invoke(target, args); return invoke; } }
③測試
@Test public void test() { MyProxy myProxy = new MyProxy(); UserServiceImpl userServiceImpl = new UserServiceImpl(); UserService userService =(UserService) myProxy.getProxy(userServiceImpl); userService.add(); System.out.println("----------------------------"); String delete = userService.delete(); System.out.println("delete() 返回值:"+delete); }
測試結果
補充: 被代理的類要有實現的介面,如果沒有實現的介面,就要用cglib的方式了