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"); } }