使用代理的目的是要对被代理类的方法进行增强处理,项目中比较常见的实现如:使用AOP对某些业务方法进行动态增强,如统计请求耗时,记录日志,根据请求控制使用的数据源等;
代码如下:
/**
* 静态代理
* StaticProxy代理类
* Created by gjn on 2020/4/25
*/
public class StaticProxy {
Movie realMovie;
public StaticProxy(Movie movie){
this.realMovie = movie;
}
public void xPlay(){
System.out.println("增强开始.");
realMovie.play();
System.out.println("增强结束.");
}
public static void main(String[] args) {
//静态代理增强
Movie realMovie = new RealMovie();
// StaticProxy proxy = new StaticProxy(realMovie);
// proxy.xPlay();
//动态代理增强
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(realMovie, args);
}
};
Movie movie = (Movie) Proxy.newProxyInstance(RealMovie.class.getClassLoader(), RealMovie.class.getInterfaces(), invocationHandler);
System.out.println("动态增强开始..");
movie.play();
System.out.println("动态增强结束..");
}
}
class RealMovie implements Movie {
@Override
public void play() {
System.out.println("播放电影..");
}
}
interface Movie{
void play();
}