更新時間:2022-08-09 10:04:04 來源:動力節點 瀏覽1826次
代理類在程序運行時創建代理的方式叫Java動態代理模式,也就是說代理類并不是在java代碼中定義的,而是在運行的時候動態生成的
1.代理對象不需要實現接口
2.代理對象的生成使用JDK API在內存中動態構建代理對象(我們需要指定代理的接口object/target object implements Type)
3.動態代理也叫:JDK代理、接口代理
JDK中生成代理對象的API代理類的封裝:java.lang.reflect.Proxy JDK實現代理只需要使用newProxyInstance方法,但是該方法需要接收三個參數。完整的寫作是:
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
注意這個方法是Proxy類中的靜態方法,接收的三個參數依次是:
類加載器加載器: 指定當前目標對象使用類加載器,獲取加載器的方法固定
類[] 接口:目標對象實現的接口的類型,使用泛型方法確認類型
調用處理程序 h:事件處理,當目標對象的方法被執行時,會觸發事件處理器的方法,將當前執行的目標對象的方法作為參數傳入
代碼示例:接口類IUserDao.java和接口實現類,目標對象UserDao相同,無需修改。在此基礎上添加一個代理工廠類(ProxyFactory.java),在這個地方寫代理類,然后測試類(需要使用代理的代碼)首先建立目標對象和代理對象的連接,然后替換代理對象中的同名方法
代理工廠類:ProxyFactory.java
/** * 創建動態代理對象 * 動態代理不需要實現接口,但是需要指定接口類型 */
public class ProxyFactory{
//維護一個目標對象
private Object target;
public ProxyFactory(Object target){
this.target=target;
}
//給目標對象生成代理對象
public Object getProxyInstance(){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("開始事務2");
//執行目標對象方法
Object returnValue = method.invoke(target, args);
System.out.println("提交事務2");
return returnValue;
}
}
);
}
}
測試類:App.java
/** * 測試類 */
public class App {
public static void main(String[] args) {
//目標對象
IUserDao target = new UserDao();
//【原始的類型 class cn.itcast.b_dynamic.UserDao】
System.out.println(target.getClass());
//給目標對象,創建代理對象
IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
//class $Proxy0 內存中動態生成的代理對象
System.out.println(proxy.getClass());
//執行方法 【代理對象】
proxy.save();
}
}
總結:代理對象不需要實現接口,但目標對象必須實現接口,否則無法使用動態代理。如果大家想了解更多相關知識,可以關注一下動力節點的Java設計模式,里面有更豐富的知識等著大家去學習,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習