java設計模式之動態代理的概述和實現
阿新 • • 發佈:2018-12-21
概述
1.代理:本來應該自己做的事情,請了別人來做,被請的人就是代理物件。
舉例:春節回家買票讓人代買
2.在Java中java.lang.reflect包下提供了一個Proxy類和一個InvocationHandler介面
3.通過使用這個類和介面就可以生成動態代理物件。
4.JDK提供的代理只能針對介面做代理。我們有更強大的代理cglib(介面、非介面的類都可代理)
5.Proxy 通過 newProxyInstance(loader,interfaces,h)建立代理物件
5.InvocationHandler的invoke(proxy,method, args)方法會攔截方法的呼叫
package demo1; public class UserServiceImp implements UserService { @Override public void registerUser() { // TODO Auto-generated method stub System.out.println("註冊使用者"); } @Override public void deleteUser() { // TODO Auto-generated method stub System.out.println("刪除使用者"); } }
package demo1; public interface UserService { public void registerUser(); public void deleteUser(); }
package demo1; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { //建立物件 UserServiceImp usi = new UserServiceImp(); //usi.registerUser(); //usi.deleteUser(); //建立代理物件 UserService proxy = (UserService) Proxy.newProxyInstance(usi.getClass().getClassLoader(), usi.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub //此處攔截了usi的兩個方法,下面可通過invoke來呼叫 System.out.println("許可權校驗======"); Object returnObj = method.invoke(usi,args); System.out.println("日誌記錄======="); return returnObj; } }); proxy.registerUser(); proxy.deleteUser(); } }