代理设计模式之动态代理
何为Java代理
Java代理是一种设计模式----代理设计模式
其定义为:使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。
用简单粗暴的话说,就是你要做的事情由你的经纪人代你完成
或者说 替身攻击
何为动态代理
提到动态代理,与其对应的则是静态代理,静态代理的特征是代理类和被代理类都是在编译时就确定下来的,不利于程序的扩展。
而动态代理着重于动态
,而相较于静态代理的写死
,动态代理则能够更加灵活统一的处理众多方法
代理的简单规则
代理类和被代理类都要实现同一接口
要想实现动态代理,需要解决的两个问题
1.如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象
2.当通过代理类的对象调用方法时,如何动态的去调用被代理类中同名的方法
下面通过代码来让我们体会一下动态代理
// 定义一个接口
interface Human {
void hit();
String say(String say);
}
// 定义被代理类 定义两个需要“替身攻击”的方法
class MovieStar implements Human {
@Override
public void hit() {
System.out.println("乌鸦坐飞机");
}
@Override
public String say(String say) {
return say;
}
}
// 定义代理工厂,动态的产出代理类
class ProxyFactory {
// 调用此方法,返回一个代理对象,解决问题1
public static Object getProxyInstance(Object obj) { // obj 被代理对象
// 这里的Proxy.newProxyInstance需要传入三个参数,1.被代理对象的类加载器 2.被代理对象实现的接口, 3.InvocationHandler接口
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(obj, args);
}
});
}
}
// 测试类
public class ProxyTest {
public static void main(String[] args) {
MovieStar movieStar = new MovieStar();
Human proxyInstance = (Human) ProxyFactory.getProxyInstance(movieStar);
proxyInstance.hit();
System.out.println(proxyInstance.say("老鼠走迷宫"));
}
}