动态代理实现代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 接口
public interface IUserDao {void save();void find();
}//目標(biāo)對(duì)象
class UserDao implements IUserDao{@Overridepublic void save() {System.out.println("模擬: 保存用戶!");}@Overridepublic void find() {System.out.println("查詢");}
}/*** 動(dòng)態(tài)代理:* 代理工廠,給多個(gè)目標(biāo)對(duì)象生成代理對(duì)象!**/
class ProxyFactory {// 接收一個(gè)目標(biāo)對(duì)象private Object target;public ProxyFactory(Object target) {this.target = target;}// 返回對(duì)目標(biāo)對(duì)象(target)代理后的對(duì)象(proxy)public Object getProxyInstance() {Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), // 目標(biāo)對(duì)象使用的類(lèi)加載器target.getClass().getInterfaces(), // 目標(biāo)對(duì)象實(shí)現(xiàn)的所有接口new InvocationHandler() { // 執(zhí)行代理對(duì)象方法時(shí)候觸發(fā)@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// 獲取當(dāng)前執(zhí)行的方法的方法名String methodName = method.getName();// 方法返回值Object result = null;if ("find".equals(methodName)) {// 直接調(diào)用目標(biāo)對(duì)象方法result = method.invoke(target, args);} else {System.out.println("開(kāi)啟事務(wù)...");// 執(zhí)行目標(biāo)對(duì)象方法result = method.invoke(target, args);System.out.println("提交事務(wù)...");}return result;}});return proxy;}
}
總結(jié)
- 上一篇: 年轻代为什么要设置两个Survivor区
- 下一篇: 存储引擎放弃使用索引的方式