这篇文章将为大家详细讲解有关Java中怎么实现静动态代理模式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.静态代理模式 使用场合:为其他对象提供一种代理以控制对这个对象的访问。在某些情况
这篇文章将为大家详细讲解有关Java中怎么实现静动态代理模式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
1.静态代理模式
使用场合:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
涉及的角色:
抽象角色:
声明真实对象和代理对象的共同接口;
代理角色:
代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:
代理角色所代表的真实对象,是我们最终要引用的对象。
***的老师是代码,下面是本人敲的一个静态代理代码示例
Java代码 收藏代码
package com; interface Station { void sellTicks();// 卖票 void transport();// 运输乘客 } class TrainStationImpl implements Station { @Override public void sellTicks() { System.out.println("TrainStation sell tickets"); } @Override public void transport() { System.out.println("TrainStation transport passenger"); } } class StationProxy implements Station { Station sta = new TrainStationImpl(); @Override public void sellTicks() { sta.sellTicks();//代理类中调用真实角色的方法。 } public void otherOperate() { System.out.println("do some other things..."); } @Override public void transport() { System.out.println("StationProxy can not transport"); } } public class StaticProxyDemo { public static void main(String[] args) { Station station = new StationProxy();//客户端直接操作代理类,避免了客户端与真实类的直接交涉 station.sellTicks(); } }
2.动态代理模式
静态代理模式中,真实角色必须是事先已经存在的,并将其作为代理对象的内部属性,并且真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀。那么,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。
动态代理必需用到以下两个类。
(1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args)。用于完成真实角色中方法的调用。(2).Proxy:该类即为动态代理类,作用类似于静态代理模式的代理类
***的老师是代码,下面是本人敲的一个动态代理代码示例
Java代码 收藏代码
package com.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Station { void sellTicks();// 卖票 } class TrainStationImpl implements Station { @Override public void sellTicks() { System.out.println("TrainStation sell tickets"); } } class InvocationHandlerImpl implements InvocationHandler { Object proxyobj; public InvocationHandlerImpl(Object object) { this.proxyobj = object; } @Override public Object invoke(Object obj, Method method, Object[] args) throws Throwable { System.out.println("start doing ........."); method.invoke(proxyobj, args);//调用被代理对象proxyobj的方法method,传入一个参数组args System.out.println("stop doing ........."); return null; } } public class DynamicProxyDemo { public static void main(String[] args) { Station stationImpl = new TrainStationImpl();//将要被代理的真实对象 InvocationHandler handler = new InvocationHandlerImpl(stationImpl);//用InvocationHandler的实现类包装真实的被代理角色 ClassLoader loader = handler.getClass().getClassLoader();//获取当期那java程序的类装在器Classloadler Class<?>[] interfaces = stationImpl.getClass().getInterfaces();//获取被代理角色实现的所有接口 Station station = (Station) Proxy.newProxyInstance(loader, interfaces,handler); station.sellTicks();//将会去执行DynamicProxy的invoke方法,完成对目标对象方法的调用 } }
关于Java中怎么实现静动态代理模式就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
--结束END--
本文标题: Java中怎么实现静动态代理模式
本文链接: https://www.lsjlt.com/news/288897.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-02
2024-05-02
2024-05-02
2024-05-02
2024-05-02
2024-05-02
2024-05-02
2024-05-02
2024-05-02
2024-05-02
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0