Java代理模式主要有三種類型:靜態代理、動態代理和CGLIB代理。
靜態代理: 靜態代理是在編譯時生成代理類,代理類和被代理類實現相同的接口,并持有被代理類的實例。在調用被代理類的方法時,代理類將方法調用轉發給被代理類的實例。靜態代理的優點是簡單易懂,缺點是需要為每個需要代理的類都編寫一個代理類,導致代碼量增加。
動態代理: 動態代理是在運行時生成代理類,代理類同樣實現與被代理類相同的接口,并持有被代理類的實例。動態代理的優點是只需要編寫一個代理類,就可以代理多個類,代碼量減少。動態代理的核心是InvocationHandler接口,它負責處理代理類的方法調用。Java提供了java.lang.reflect.Proxy類來創建動態代理對象。
CGLIB代理: CGLIB代理是基于繼承被代理類的方式生成代理類。CGLIB代理的優點是可以代理沒有實現接口的類,缺點是代理類會繼承被代理類的所有方法,可能導致代理類變得龐大。CGLIB通過繼承被代理類的方式生成子類,并在子類中添加代理邏輯。
總結: 靜態代理和動態代理都是基于接口實現的,而CGLIB代理是基于繼承實現的。靜態代理適用于簡單的場景,動態代理適用于需要代理多個類的場景,而CGLIB代理適用于需要代理沒有實現接口的類的場景。