jdk 动态代理是代理模式的一种。只能对实现了接口的类产生代理。是spring aop 的底层技术之一,与cglib动态代理(对没有实现接口的类产生代理对象)相互补充。
这篇文章简单介绍下jdk动态代理是如何实现的。
- 首先 jdk动态代理是对实现接口的类而言的,我们首先创建一个接口
创建了增删改查的方法,
package aop_jdkproxy;
/**
* @Author: Han Yu
* @Description:
* @Date: Create in 11:24 2019/1/15
*/
public interface UserService {
void save();
void update();
void delete();
void find();
}
- 然后 创建类实现这个接口
package aop_jdkproxy;
/**
* @Author: Han Yu
* @Description:
* @Date: Create in 16:05 2019/1/14
*/
public class UserServiceImpl implements UserService {
@Override
public void save() {
System.out.println("保存用户");
}
@Override
public void update() {
System.out.println("修改用户");
}
@Override
public void delete() {
System.out.println("删除用户");
}
@Override
public void find() {
System.out.println("查找用户");
}
}
- 那么现在问题来了,我们想验证用户有没有调用这些方法的权限,这个时候怎么办呢,如果是不交权限我们既可以直接通过下面的代码调用方法
UserService userService = new UserServiceImpl();
userService .delete();
userService .update();
userService .find();
userService .save();
- 但是现在需要权限校验 我们引入jdk动态代理,使用jdk动态代理 对UserService产生代理
package aop_jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @Author: Han Yu
* @Description: 使用jdk动态代理 对UserService产生代理
* @Date: Create in 16:05 2019/1/14
*/
public class JdkProxy implements InvocationHandler {
//将被增强的对象传递到代理当中
private UserService userService;
public JdkProxy(UserService userService){
this.userService =userService;
}
/**
*@Author: Han Yu
*@Description: 产生UserService代理的方法
*@Param:
*@Return:
*@Date: Create in 11:44 2019/1/15
*/
public UserService createProxy(){
//第一个参数类加载器
UserService userServiceProxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),userService.getClass().getInterfaces(),this);
return userServiceProxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//判断方法名是不是我们要增强的哪个方法名
if("save".equals(method.getName()))
{
//增强
System.out.println("增强 权限校验");
return method.invoke(userService,args);
}else{
}
return method.invoke(userService,args);
}
}
- 测试类
package aop_jdkproxy;
import org.junit.Test;
/**
* @Author: Han Yu
* @Description:
* @Date: Create in 16:05 2019/1/14
*/
public class UserTest {
@Test
//jdk动态代理
public void userServiceTest(){
UserService userService= new UserServiceImpl();
//创建代理
UserService proxy = new JdkProxy(userService).createProxy();
proxy .save();
}
}
- 结果