动态代理
何为动态代理?
相比于传统的静态代理,每一个需要代理的类,我们都需要写一个代理对象进行代理,那么一百个需要代理的类难道我们要写一百个么?
答案是否定的,我们所谓的动态代理就应运而生了;它可以自动的帮我们创建相应的代理类。
首先了解两个类:
Proxy:生成动态代理实例的
setObject()
设置需要代理的类型
getProxy()
得到代理的对象
InvocationHandler:调用处理程序并返回结果的
invoke()
当代理对象pih调用方法的时候
例如pih.add(),此时会自动执行invoke()方法
当然我们可以在invoke()方法中添加我们需要的逻辑实现我们想要的目的,例如我所增加的log(msg)方法,打印当前方法名称。
1 工具类
获取动态代理proxy
package com.xzzlx.demo02;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvovationHandler implements InvocationHandler {
/**
* 被代理的接口
*/
private Object object;
// 设置代理类型
public void setObject(Object object) {
this.object = object;
}
// 获取代理对象
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
object.getClass().getInterfaces(),
this);
}
// 执行代理方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(logName(method.getName()));
return method.invoke(object, args);
}
public String logName(String msg){
return "执行了" + msg + "方法";
}
}
2 接口
用户服务接口
package com.xzzlx.demo02;
public interface UserService {
/**
* 增加
*/
void add();
/**
* 删除
*/
void deleted();
/**
* 更新
*/
void update();
/**
* 查询
*/
void select();
}
3 接口实现类
用户接口实现类
package com.xzzlx.demo02;
public class UserServiceImpl implements UserService{
@Override
public void add() {
System.out.println("这是增加");
}
@Override
public void deleted() {
System.out.println("这是删除");
}
@Override
public void update() {
System.out.println("这是更改");
}
@Override
public void select() {
System.out.println("这是查询");
}
}
4 测试类
用户动态代理测试类
package com.xzzlx.demo02;
import org.junit.jupiter.api.Test;
public class User {
@Test
public void test(){
// 真实对象
UserService userService = new UserServiceImpl();
// 代理调用处理程序
ProxyInvovationHandler pih = new ProxyInvovationHandler();
// 设置代理对象
pih.setObject(userService);
// 这里强转类型是接口的类型,一定要注意!!!
UserService proxy = (UserService) pih.getProxy();
// 动态代理对象调用方法
proxy.add();
proxy.deleted();
proxy.update();
proxy.select();
}
}
有问题可以留言一起讨论~~~