动态代理
代理就是被代理者没有能力或者不愿意去完成某件事情,需要找个人代替自己去完成这件事,动态代理就是用来对业务功能(方法)进行代理的。
关键步骤
- 必须有接口,实现类要实现接口(代理通常是基于接口实现的)。
- 创建一个实现类的对象,该对象为业务对象,紧接着为业务对象做一个代理对象。
Runner接口
public interface Runner {
void exercise();
void run();
}
People类
public class People implements Runner {
private String name;
public People(String name){
this.name = name;
}
@Override
public void exercise() {
System.out.println("日程训练 2 小时。。。。");
}
@Override
public void run() {
System.out.println("认真开始 比赛 了");
}
}
代理工具
public class ProxyUtil {
public static Runner createProxy (People people){
Runner runnerProxy = (Runner) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Runner.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().equals("run")) {
System.out.println("坐飞机去 赛场 ");
}else if ( "exercise".equals(method.getName())) {
System.out.println("每次训练都做好热身准备 ");
}
return method.invoke(people,args);
}
});
return runnerProxy;
}
}
测试类
public class Test {
@org.junit.Test
public void test (){
People p = new People("黎明");
Runner proxy = ProxyUtil.createProxy(p);
proxy.run();
proxy.exercise();
}
}
动态代理的优点
-
非常的灵活,支持任意接口类型的实现类对象做代理,也可以直接为接本身做代理。
-
可以为被代理对象的所有方法做代理。
-
可以在不改变方法源码的情况下,实现对方法功能的增强。
-
不仅简化了编程工作、提高了软件系统的可扩展性,同时也提高了开发效率。