package com.sjl;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 動態代理類
*/
public class DynamicProxyTest{
public static void main(String[] args) {
UserDao ud = (UserDao) new DynamicProxy().bind(new UserService());
ud.findByName("李三");
ud.doCreate(null);
}
}
class DynamicProxy implements InvocationHandler {
private Object target;//代理對象
public Object bind(Object target){//由系統生成一個指定接口的代理類對象
this.target = target;
//返回與當前傳入對象結構相同的代理類對象
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
this.log(method.getName());
Object retObj = method.invoke(this.target,args);
if(method.getName().matches("do[a-zA-Z0-9]+")){
this.commit(method.getName());
}
return retObj;
}
public void log(String methodName){
System.out.println("進行日誌記錄,方法:"+methodName);
}
public void commit(String methodName){
System.out.println(String.format("進行事務提交,方法:%s",methodName));
}
}
class UserService implements UserDao{
public void findByName(String name){
System.out.println(String.format("根據名字 %s 查找用戶",name));
}
public void doCreate(Object obj){
System.out.println(String.format("創建用戶"));
}
}
interface UserDao{
void findByName(String name);
void doCreate(Object obj);
}
該模式的限制:必須要有接口。爲了解決這一問題,可以使用第三方jar:cglib包,實現基於類實現的動態代理模式
cglib包:處理動態代理設計模式
package com.sjl;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* cglib包:處理動態代理設計模式
*/
public class DynamicProxyCglibTest{
public static void main(String[] args) {
final UserService1 us = new UserService1();
Enhancer en = new Enhancer();
en.setSuperclass(UserService1.class);
en.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o,objects);
}
});
//創建代理類
UserService1 us1 = (UserService1)en.create();
//調用代理類的方法
us1.findByName("李四");
}
}
class UserService1{
public void findByName(String name){
System.out.println(String.format("根據名字 %s 查找用戶",name));
}
public void doCreate(Object obj){
System.out.println(String.format("創建用戶"));
}
}
設計模式之代理設計模式(動態代理類寫法)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.