chenhang 的博客

HansChen 的博客

马上订阅 chenhang 的博客 RSS 更新: http://blog.hanschen.site/atom.xml

java动态代理

2016年10月20日 00:00

概述

动态代理是java的一大特性,动态代理的优势就是实现无侵入式的代码扩展。它可以增强我们原有的方法,比如常用的日志监控,添加缓存等,也可以实现方法拦截,通过代理方法修改原方法的参数和返回值等。
要了解动态代理,我们需要先看看什么是静态代理

静态代理

首先你有一个接口:

1
2
3
4
public interface Api {

String doSomething(String input);
}

这个接口有一个原始的实现:

1
2
3
4
5
6
7
public class ApiImpl implements Api {

@Override
public String doSomething(String input) {
return input + "原始方法";
}
}

现在问题来了,有一个新的需求,我需要在所有调用doSomething的地方都添加一个log,那怎么办呢?我们当然可以在原有代码上直接加上log,但是ApiImpl里面的log真的是那段代码需要的吗?如果不修改原有代码,能不能实现?当然可以,如,我们添加一个代理类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ApiProxy implements Api {

private Api mBase;

public ApiProxy(Api base) {
mBase = base;
}

@Override
public String doSomething(String input) {
System.out.println("someone call me~");
return mBase.doSomething(input);
}
}

这样,通过ApiProxy我们就是实现静态代理,这里只是简单的添加了log,我们完全可以在ApiProxy的doSomething方法里面,篡改输入参数input以及返回值,从而做一些坏事~

动态代理

在上面静态代理例子中,我们已经实现了代理的功能,那为何还需要动态代理呢?设想一下以下两种情况

  • 如果Api接口类中有100个方法,需要为每个方法都添加log
  • 项目中有100个类,需要为每个类的方法都添加log

对于第一种情况,如果使用静态代理,那就只能这样了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21...

剩余内容已隐藏

查看完整文章以阅读更多