Java設計模式【CGLIB代理小案例】

【注: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();
    }
}

測試結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章