Spring Study -lesson11-动态代理(反射机制)-2023-03-18
第一:接口类(增删改查)
package com.feijian.Service;
public interface UserService {
public void addUser();
public void updateUser();
public void deleteUser();
public void insertUser();
}
第二:接口实现类(implements)
package com.feijian.Service;
public class UserServiceImpl implements UserService{
@Override
public void addUser() {
System.out.println("增加了一个用户");
}
@Override
public void updateUser() {
System.out.println("更新了一个用户");
}
@Override
public void deleteUser() {
System.out.println("删除了一个用户");
}
@Override
public void insertUser() {
System.out.println("插入了一个用户");
}
}
第三:自动生成代理类 (变为一个工具类) 1、代理谁 2、生成得到代理类 3、调用代理的执行方法
package com.feijian.Demo02;
import com.feijian.Demo.Rent;
import com.sun.corba.se.impl.ior.OldJIDLObjectKeyTemplate;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//用这个类自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {
//1、代理谁? 被代理的接口
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//2、生成得到代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this );
}
@Override
//3、处理代理实例,调用代理的执行方法
//动态代理的本质就是用反射机制
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
Object result = method.invoke(target, args);
return result;
}
public void log(String msg){
System.out.println("执行了"+msg+"方法");
}
}
第四:测试
package com.feijian.Demo02;
import com.feijian.Service.UserService;
import com.feijian.Service.UserServiceImpl;
import java.lang.reflect.InvocationHandler;
public class Client {
public static void main(String[] args) {
//1、真实角色
UserServiceImpl userService = new UserServiceImpl();
//2、代理角色,不存在
ProxyInvocationHandler pih = new ProxyInvocationHandler();
//3、设置要代理的对象 (set方法)
pih.setTarget(userService);
//4、动态生成代理类
UserService proxy = (UserService) pih.getProxy();
//5、代理执行不同的方法
proxy.insertUser();
}
}