动态代理:
代理程序中某个类中的功能,为该功能进行增强
动态代理实现步步骤:
1.补代理类,必须要有实现接口
2.创建被代理对象,交给代理对象使用
动态代理的实现
package javaseproxy.demo1;
import org.junit.Test;
import java.io.Serializable;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;
//处理器
class MyInvocationHandler implements InvocationHandler{
private UserService userService;
public MyInvocationHandler(UserService userService) {
this.userService = userService;
}
public MyInvocationHandler() {
}
/**
*
* @param proxy 代理对象(不使用)
* @param method 方法对象(被代理类所书写的每一个成员方法)
* @param args 成员方法中的参数
* @return 方法方法执行后的结果
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method);
//记录开始时间
long beginTime=System.currentTimeMillis();
//使用Method对象,执行原有方法(被代理)功能
Object result =method.invoke(userService,args);
//记录结束时间
long endTime=System.currentTimeMillis();
System.out.println("findAllUser执行消耗"+(endTime-beginTime)+"秒");
return result;
}
}
public class UserServiceImplTest2 {
@Test
public void testProxy(){
//前置:UserServiceImpl 有实现接口
//创建:被代理对象
UserService userService = new UserServiceImpl();
//被代理所实现的所有接口
//Class[] interfaces={ UserService.class};
//注意,当一个类实现的接口比较多量,使用以上的方式,书写代码就繁琐了
//简代代码: 获取被代理类对象的Class对象,基于Class类获取所有的实现接口
Class[] interfaces=userService.getClass().getInterfaces();
//使用JDK提供的Proxy代理对象
UserService proxyObj = (UserService) Proxy.newProxyInstance(
//参数1:类加载
userService.getClass().getClassLoader(),
//参数2:接口数组(被代理类所实现的所有接口
userService.getClass().getInterfaces(),
//参数3:处理器(关键)
new MyInvocationHandler(userService)
);
//使用代理对象,调用方法
List<User> allUser = proxyObj.findAllUser();
for (User user:allUser){
System.out.println(user);
}
//proxyObj.deleteUserById(1);
}
}