【注:CGLIB代理不能代理final,static修飾的目標類】
目錄結構:
需要四個jar包:asm.jar | asm-commons.jar | asm-tree.jar | cglib.jar
下載方式: 打開 https://mvnrepository.com/ 搜索對應的jar包下載,導入項目即可。
目標對象類:【UserService】
public class UserService {
public void AddUser(){
System.out.println("添加員工");
}
public void DeleteUser(){
System.out.println("刪除員工成功");
}
}
代理工場類:【ProxyFactory】
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class ProxyFactory implements MethodInterceptor {
// 聚合目標對象
private UserService target;
// 代理工廠構造函數
public ProxyFactory(UserService target) {
this.target = target;
}
// 用戶返回代理對象
public Object getProxyInstance(){
// 1. 創建一個工具類
Enhancer enhancer = new Enhancer();
// 2. 設置父類
enhancer.setSuperclass(target.getClass());
// 3. 設置回調函數
enhancer.setCallback(this);
// 4. 創建子類對象, 即代理對象
Object object = enhancer.create();
return object;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
// 代理開始
System.out.println("代理開始");
// 執行目標對象方法
Object object = method.invoke(target,objects);
System.out.println("代理結束");
// 返回代理對象
return object;
}
}
測試類:【MyTest】
import org.junit.Test;
public class MyTest {
@Test
public void f(){
// 創建目標對象
UserService userService = new UserService();
// 創建代理工廠對象,返回代理對象 將目標對象作爲參數傳入
ProxyFactory proxyFactory = new ProxyFactory(userService);
// 通過工廠獲得代理對象
UserService userServiceProxy = (UserService) proxyFactory.getProxyInstance();
// 執行代理對象方法
userServiceProxy.AddUser();
System.out.println("-----------------------");
userServiceProxy.DeleteUser();
}
}
測試結果: