1. 静态代理

2. 动态代理
可以在不改变目标方法功能的前提下,在代理中增强自己的功能代码,达到功能增强的目的。
程序开发中的意义:比如,你所在的项目中,有一个功能是别人写好的,比如print(“hello”),你想在这个功能基础上再加上其他的功能,比如再输出print(“world”),但不别人的文件,这就需要代理完成

动态代理相关的类:
- InvocationHandler接口
- Proxy类newProxyInstance方法
-
接口
public interface UserService { void sayHello(String str); } -
实现类
public class UserServiceFactory implements UserService { @Override public void sayHello(String str) { System.out.println(str); } } -
Handler
public class MyUserServiceHandler implements InvocationHandler { private Object target = null; public MyUserServiceHandler(Object target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 原来的方法 method.invoke(target, "Hello"); // 增强方法 for (Object arg : args) { System.out.println(arg); } return null; } } -
test
public class DynamicProxyTest { public static void main(String[] args) { UserServiceFactory userServiceFactory = new UserServiceFactory(); MyUserServiceHandler myUserServiceHandler = new MyUserServiceHandler(userServiceFactory); UserService userService = (UserService) Proxy.newProxyInstance(userServiceFactory.getClass().getClassLoader(), userServiceFactory.getClass().getInterfaces(), myUserServiceHandler); userService.sayHello("world"); } }
本文介绍了Java中的动态代理机制,通过一个实例展示了如何使用InvocationHandler接口和Proxy类实现动态代理,以此在不修改原有代码的基础上增强功能。在程序开发中,动态代理常用于功能扩展、AOP(面向切面编程)等场景,如日志记录、权限校验等。示例中,我们创建了一个UserService的动态代理,实现了在调用sayHello方法时同时输出参数。
168万+

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



