JDK動态代理在1.3的時候引入,其底層需要依賴一個工具類java.lang.reflect.Proxy和一個接口java.lang.reflect.InvocationHandler
JDK 動态代理 必須基于 接口進行代理
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLio3YU50dBRVT5FkaNhXTU50djRVT3lkeMBjVtJWd0ckW65UbM5WOHJWa1knW0xmMMZ3bENGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
代碼示例:
JdkProxyUtils.java
package com.my.jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//對目标對象 建立 JDK 動态代理 (工具類)
public class JdkProxyUtils implements InvocationHandler {
// 代理目标對象
private Object target;
public JdkProxyUtils(Object target) {
this.target = target;
}
//通過invoke調用 目标對象 方法
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("執行JDK代理增強!!!!!!");
return method.invoke(target, args); // 調用目标對象方法
}
// 為目标對象建立代理
public Object createProxy(){
// loader 目标對象類加載器
// interfaces 目标對象實作接口
// h 回調對象,需要invocationhandler 執行目标對象方法
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
UserDao.java
package com.my.jdkproxy;
//使用者操作接口
public interface UserDao {
public void save();
public void update();
public void delete();
}
UserDaoImpl.java
package com.my.jdkproxy;
//使用者操作實作類
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("儲存使用者。。。");
}
@Override
public void update() {
System.out.println("更新使用者。。。");
}
@Override
public void delete() {
System.out.println("删除使用者。。。");
}
}
Test.java
package com.my.jdkproxy;
public class Test {
// 沒有代理程式設計
@org.junit.Test
public void demo1(){
System.out.println("沒有代理程式設計");
// 業務對象
UserDao userDao = new UserDaoImpl();
userDao.save();
userDao.update();
userDao.delete();
System.out.println("----------------");
}
// 應用JDK動态代理
@org.junit.Test
public void demo2(){
System.out.println();
System.out.println("應用JDK動态代理");
// 目标對象
UserDao userDao = new UserDaoImpl();
// 為目标對象 建立JDK動态代理
JdkProxyUtils jdkProxyUtils = new JdkProxyUtils(userDao);// 傳入目标對象
UserDao proxy = (UserDao) jdkProxyUtils.createProxy(); // 必須根據接口建立代理
// 調用代理對象方法
proxy.save(); // 執行 InvocationHandler 的 invoke方法
proxy.update();
proxy.delete();
}
}
運作結果: