有两种情况动态代理
第一种 有接口情况,使用 JDK 动态代理
第二种 没有接口情况,使用 CGLIB 动态代理
1、 使用 JDK 动态代理,使用 Proxy 类里面的方法创建代理对象
2、 编写 JDK 动态代理代码
(1)创建接口,定义方法
public interface UserDao {
int add(int a, int b);
String update(String id);
}
(2)创建接口实现类,实现方法
public class UserDaoImpl implements UserDao {
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public String update(String id) {
return id+"!";
}
}
(3)使用 Proxy 类创建接口代理对象 ,需要传入要代理增强的接口
和实现了InvocationHandler接口的代理增强对象
public class UserProxy {
public static void main(String[] args) {
Class[] interfaces = {UserDao.class};//要增强的接口
//对UserDao这个类进行增强,
UserDaoImpl userDao = new UserDaoImpl();
UserDao dao = (UserDao) Proxy.newProxyInstance(UserProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
System.out.println(dao.add(1, 3));
}
}
class UserDaoProxy implements InvocationHandler {
//把创建的代理对象传递进来,利用有参构造
private Object obj;
public UserDaoProxy(Object obj) {
this.obj = obj;
}
//增强的逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法之前执行..." + method.getName() + "传递的参数" + Arrays.toString(args));
Object res = method.invoke(obj, args);
System.out.println("方法之后执行..." + obj);
return res;
}
}
最后分享一句我看到书上的一句话,反射是为了扩展类的使用,代理是为了扩展接口的使用
如果觉得对你有帮助的话:
点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
评论,你的意见是我进步的财富!