JAVA静态代理和动态代理
参考文章:https://www.jianshu.com/p/9bcac608c714
代理模式
为其他对象提供一个代理以控制对某个对象的访问。代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。
代理类为被代理类预处理消息、过滤消息并在此之后将消息转发给被代理类,之后还能进行消息的后置处理。代理类和被代理类通常会存在关联关系(即上面提到的持有的被代理对象的引用),代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。
静态代理
静态代理的模式:首先创建一个接口,然后被代理类实现这个接口,再创建一个代理类,代理类中创建一个被代理类对象的引用,然后代理类中完成被代理类的方法。
有点绕,只要记住一点:代理类主要负责预处理消息、过滤消息、传递消息,所以方法要在代理类中进行加工和调用。
下面来看代码:
1、创建接口
public interface HelloInterface {
void sayHello();
}
2、创建被代理类实现接口:
public class Hello implements HelloInterface{
public void sayHello() {
System.out.println("Hello");
}
}
3、创建代理类,在该类中,实现被代理类的引用以及方法调用和加工
public class HelloProxy implements HelloInterface{
private HelloInterface helloInterface = (HelloInterface) new Hello();
public void sayHello() {
System.out.println("before invok");
helloInterface.sayHello();
System.out.println("after invok");
}
}
4、通过代理类对象,对目标方法进行调用
public static void main(String[] args) {
HelloProxy hello = new HelloProxy();
}
静态代理存在缺点:每个代理类只能为一个类服务,如果要代理的类很多,就需要编写大量的代理类。
例如,再来一个Bye类:
1、接口:
public interface ByeInterface {
void sayBye();
}
2、接口实现
public class Bye implements ByeInterface{
public void sayBye() {
System.out.println("GoodBye!");
}
}
3、代理类中引用方法
注意,这时候就会发现,原来的那个Hello代理不可以代理这个,必须要新建一个此方法的专属代理
public class ByeProxy implements ByeInterface{
private ByeInterface byeInterface = (ByeInterface) new Bye();
public void sayBye(){
System.out.println("before invok");
byeInterface.sayBye();
System.out.println("after invok");
}
}
4、main方法也要new一个新代理的对象
ByeProxy bye = new ByeProxy();
bye.sayBye();
结果:
动态代理
前两步相同:1、创建接口 , 2、接口实现
3、代理:
public class ProxyHandler implements InvocationHandler{
private Object object;
public ProxyHandler(Object object){
this.object = object;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before invok "+method.getName());
method.invoke(object,args);
System.out.println("after invok "+method.getName());
return null;
}
}
构建一个handler类来实现InvocationHandler接口
4、main
public static void main(String[] args) {
HelloInterface hello = new Hello();
ByeInterface bye = new Bye();
InvocationHandler handler = new ProxyHandler(hello);
InvocationHandler handler2 = new ProxyHandler(bye);
HelloInterface proxyHello = (HelloInterface) Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), handler);
ByeInterface proxyBye = (ByeInterface) Proxy.newProxyInstance(bye.getClass().getClassLoader(), bye.getClass().getInterfaces(), handler2);
proxyHello.sayHello();
proxyBye.sayBye();
}
结果:
动态代理的代理不需要新建。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2470290795@qq.com
文章标题:JAVA静态代理和动态代理
文章字数:778
本文作者:runze
发布时间:2020-02-04, 09:35:09
最后更新:2020-02-11, 19:54:12
原始链接:http://yoursite.com/2020/02/04/JVM/JAVA%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。