Java动态代理机制
演示java动态代理机制
先创建一个接口IUserService,里面定义一个抽象的登录方法
1public interface IUserService {
2
3 public void login();//登录的方法
4
5}
再创建一个实现类,实现抽象的login()方法
1public class UserService implements IUserService {
2 @Override
3 public void login() {
4 System.out.println("登录微信.....");
5 }
6}
创建一个生成代理对象的工厂类JDKProxyFactory.
1public class JDKProxyFactory {
2 //目标对象
3 private Object target;
4 //提供一个有参的构造方法,把目标对象传入进来
5 public JDKProxyFactory(Object target){
6 this.target =target;
7 }
8 //创建代理对象的方法
9 public Object createProxy(){
10 //使用Proxy来完成代理对象的创建
11 //参数一 : 目标对象的类加载器
12 ClassLoader loader = target.getClass().getClassLoader();
13 //参数二:目标对象实现的接口的数组
14 //接口可以多实现,如果目标对象实现了多个接口,通过如下的方法来获取实现所有接口的数组
15 Class[] interfaces = target.getClass().getInterfaces();
16 /*参数三:需要一个实现了InvocationHandler这个接口的对象
17 *一般都是使用匿名内部类的方式**/
18 //这里的return 代表的是直接返回一个创建好的代理对象
19 return Proxy.newProxyInstance(loader, interfaces,new InvocationHandler() {
20 //InvocationHandler的匿名内部类
21 /*参数1:Object proxy 是代理对象,一般不使用
22 参数2:Method是反射技术的方法对象.对应于在代理实例上调用的接口方法的 Method实例
23 参数3:args 包含传入代理实例上方法调用的参数值的对象数组 .如果接口方法不使用参数,则 为 null。*/
24 @Override
25 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
26 //代理对象,增强的操作,例如缓存处理
27 System.out.println("代理对象增强方法的缓存处理操作");
28 /**
29 如果在代理对象的invoke方法中,直接return method.invoke(target,args);那么代理对象没有增强任何的行为. method.invoke(target,args)这段代码,本质为目标对象执行操作.*/
30 //反射技术执行目标对象的方法
31 return method.invoke(target,args);
32 }
33 });
34 }
35}
创建一个测试类
1public class ProxyTest {
2 //测试JDK的动态代理
3 @Test
4 public void f1(){
5 //创建目标对象
6 IUserService userService = new UserService();
7
8 //创建代理对象工厂类
9 JDKProxyFactory proxyFactory = new JDKProxyFactory(userService);
10
11 //通过代理对象的工厂类来创建代理对象,并向下转型为IUserService接口
12 IUserService proxy = (IUserService) proxyFactory.createProxy();
13
14 //通过代理对象来调用接口中的方法
15 proxy.login();
16 }
17}
运行后打印的结果如下:
代理对象增强方法的缓存处理操作登录微信…..
目标对象的输出语句为"登录微信…..",在执行目标对象的方法之前,执行了代理对象的方法中的输出语句"代理对象增强方法的缓存处理操作".
利用此动态代理的原理,可在目标对象真正执行之前,做一些增强的操作.