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("创建用户"));
}
}
设计模式之代理设计模式(动态代理类写法)
最新推荐文章于 2023-01-02 20:26:38 发布