先看代碼,認識如下什麼是靜態代理bash
/**
* UserService 是 目標類的接口
* login() 就是要被代理的方法
*/
public interface UserService {
boolean login(String userName, String password);
}
複製代碼
注意,要代理的方法,必須從接口中實現ide
/**
* UserServiceImpl 是目標類,或者叫被代理的類
* login() 就是要被代理的方法
*/
public class UserServiceImpl implements UserService {
@Override
public boolean login(String userName, String password) {
System.out.println("校驗帳號");
return false;
}
}
複製代碼
注意,要代理的方法,必須從接口中實現測試
/**
* UserServiceProxy 是代理類,它繼承了 UserService 接口,實現了login()方法
*/
public class UserServiceProxy implements UserService {
/**
* 其實就是寫一個新方法把 目標方法包起來
*/
@Override
public boolean login(String userName, String password) {
before();
UserService userServiceImpl = new UserServiceImpl();
Object result = userServiceImpl.login(userName, password);
after();
return result;
}
private void before() {
System.out.println("調用目標方法以前輸出的log");
}
private void after() {
System.out.println("調用目標方法以後輸出的log");
}
}
複製代碼
上面三個類構成了jdk動態代理的最小組成單位,接下來,編寫測試類使用jdk動態代理ui
public static void main(String[] args) {
// 建立代理對象
UserService userServiceProxy = new UserServiceProxy();
// 調用代理方法
userServiceProxy.login("wqlm", "123");
}
複製代碼
靜態代理設計到三個類spa
代理類經過實現目標類的接口,使之與目標類 類型一致。而後在代理方法中調用目標方法,並在調用先後作一些操做。設計
優勢代理
缺點code