Java反射的应用之动态代理深入理解
目录
- 一、代理模式的引入
- 二、动态代理
一、代理模式的引入
文章图片
文章图片
文章图片
静态代理举例
特点:代理类和被代理类在编译期间,就确定下来了。
interface ClothFactory{void produceCloth(); }//代理类class ProxyClothFactory implements ClothFactory{private ClothFactory factory; //用被代理类对象进行实例化public ProxyClothFactory(ClothFactory factory){this.factory = factory; }@Overridepublic void produceCloth() {System.out.println("代理工厂做一些准备工作"); factory.produceCloth(); System.out.println("代理工厂做一些后续的收尾工作"); }}//被代理类class NikeClothFactory implements ClothFactory{ @Overridepublic void produceCloth() {System.out.println("Nike工厂生产一批运动服"); }}public class StaticProxyTest {public static void main(String[] args) {//创建被代理类的对象NikeClothFactory nike = new NikeClothFactory(); //创建代理类的对象ProxyClothFactory proxyClothFactory = new ProxyClothFactory(nike); proxyClothFactory.produceCloth(); }
二、动态代理
文章图片
【Java反射的应用之动态代理深入理解】
文章图片
文章图片
动态代理的举例
interface Human{String getBelief(); void eat(String food); }//被代理类class SuperMan implements Human{@Overridepublic String getBelief() {return "I believe I can fly!"; } @Overridepublic void eat(String food) {System.out.println("我喜欢吃" + food); }}class HumanUtil{public void method1(){System.out.println("===================通用方法一==============================="); }public void method2(){System.out.println("===================通用方法二==============================="); }}/*要想实现动态代理,需要解决的问题?问题一:如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象。问题二:当通过代理类的对象调用方法a时,如何动态的去调用被代理类中的同名方法a。 */class ProxyFactory{//调用此方法,返回一个代理类的对象。解决问题一public static Object getProxyInstance(Object obj){//obj:被代理类的对象MyInvocationHandler handler = new MyInvocationHandler(); handler.bind(obj); return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler); }}class MyInvocationHandler implements InvocationHandler{private Object obj; //需要使用被代理类的对象进行赋值public void bind(Object obj){this.obj = obj; }//当我们通过代理类的对象,调用方法a时,就会自动的调用如下的方法:invoke()//将被代理类要执行的方法a的功能就声明在invoke()中@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable { HumanUtil util = new HumanUtil(); util.method1(); //method:即为代理类对象调用的方法,此方法也就作为了被代理类对象要调用的方法//obj:被代理类的对象Object returnValue = https://www.it610.com/article/method.invoke(obj,args); util.method2(); //上述方法的返回值就作为当前类中的invoke()的返回值。return returnValue; }}public class ProxyTest{public static void main(String[] args) {SuperMan superMan = new SuperMan(); Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan); //当通过代理类对象调用方法时,会自动的调用被代理类中同名的方法String belief = proxyInstance.getBelief(); System.out.println(belief); proxyInstance.eat("四川麻辣烫"); System.out.println("************************************************"); NikeClothFactory nikeClothFactory = new NikeClothFactory(); ClothFactory proxyClothFactory = (ClothFactory) ProxyFactory.getProxyInstance(nikeClothFactory); proxyClothFactory.produceCloth(); }
到此这篇关于Java反射的应用之动态代理深入理解的文章就介绍到这了,更多相关Java动态代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量