动态代理实现代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 接口
public interface IUserDao {void save();void find();
}//目標對象
class UserDao implements IUserDao{@Overridepublic void save() {System.out.println("模擬: 保存用戶!");}@Overridepublic void find() {System.out.println("查詢");}
}/*** 動態代理:* 代理工廠,給多個目標對象生成代理對象!**/
class ProxyFactory {// 接收一個目標對象private Object target;public ProxyFactory(Object target) {this.target = target;}// 返回對目標對象(target)代理后的對象(proxy)public Object getProxyInstance() {Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), // 目標對象使用的類加載器target.getClass().getInterfaces(), // 目標對象實現的所有接口new InvocationHandler() { // 執行代理對象方法時候觸發@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// 獲取當前執行的方法的方法名String methodName = method.getName();// 方法返回值Object result = null;if ("find".equals(methodName)) {// 直接調用目標對象方法result = method.invoke(target, args);} else {System.out.println("開啟事務...");// 執行目標對象方法result = method.invoke(target, args);System.out.println("提交事務...");}return result;}});return proxy;}
}
總結
- 上一篇: 年轻代为什么要设置两个Survivor区
- 下一篇: Mysql剖析单条查询三种方法