1.什么是动态代理
动态代理简而言之就是,在不改变原有类的基础上,扩展自己的其他代码。
2.和静态代理模式的区别
静态代理扩展是复制一份,然后添加自己的方法,而动态代理却是通过反射的方式,不用写之前的代码,而添加自己的方法
3.代码实现
1.首先定义一个接口和一个实现类
package com.example.designmode.service;
public interface UserService {
void add();
void delete();
}
package com.example.designmode.service.impl;
import com.example.designmode.service.UserService;
public class UserServiceImpl implements UserService {
public void add() {
System.out.println("处理add方法");
}
public void delete() {
System.out.println("处理delete方法");
}
}
2.定义动态代理类
package com.example.designmode.cglib;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class CglibUser implements InvocationHandler {
Object object;
public void setObject(Object object) {
this.object = object;
}
public Object getCglib() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
handleLog(method.getName());
Object invoke = method.invoke(object, args);
return invoke;
}
public void handleLog(Object obejct) {
System.out.println("执行了"+obejct+"方法");
}
}
3.执行方法
package com.example.designmode.cglib;
import com.example.designmode.service.UserService;
import com.example.designmode.service.impl.UserServiceImpl;
public class UserMain {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
CglibUser cglibUser = new CglibUser();
cglibUser.setObject(userService);
UserService cglib = (UserService) cglibUser.getCglib();
cglib.add();
}
}
4.执行结果
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5MSuTGSw-1625291678131)(C:\Users\sunjiatao\AppData\Roaming\Typora\typora-user-images\image-20210703135327638.png)]](https://i-blog.csdnimg.cn/blog_migrate/33f3eaf8d115b7ad8d338d6829468da9.png)
5.总结
可以看到,我们没有改变原来的代码,但是扩展了我们自己的方法。
知是行之始,行是知之成
本文介绍了Java动态代理的概念,对比了动态代理与静态代理的区别,并通过实例展示了如何使用CGLIB实现动态代理,以此在不修改原代码的基础上扩展功能。最后,文中总结了动态代理的优势,强调了其在代码灵活性和维护性上的提升。
1307

被折叠的 条评论
为什么被折叠?



