zoukankan      html  css  js  c++  java
  • 反射案例------动态代理

    概述:

    代理顾名思义就是一个人不需要自己亲自去做某一件是,会有一个代理者帮他去做这件事,就好像明星和经纪人的关系,明星是被代理者,经纪人是代理者,在java中也存在这种关系:动态代理。

    在动态代理中,代理对象和被代理对象的事项前提是:

    1. 代理对象和被代理对象要实现同一个接口
    2. 代理对象要和被代理对象使用同一个类加载器

    下面是一个代码的案例:

    package com.heima.userJSTL;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class RunTimeProxyObject {
        public static void main(String[] args) {
            Supermen supermen = new Supermen();//首先创建被代理的对象
            Persons proxy = (Persons) proxyFactary.getProxy(supermen);
            String believef = proxy.believef();
            System.out.println(believef);
            proxy.eat("四川麻辣烫");
    
        }
    
    
    }
    
    //创建公共接口
    interface Persons {
        String believef();
    
        void eat(String food);
    }
    
    //创建被代理类
    class Supermen implements Persons {
    
        @Override
        public String believef() {
            return "I Believe I can fly";
        }
    
        @Override
        public void eat(String food) {
            System.out.println("超人吃" + food);
        }
    }
    
    
    //创建一个动态代理类的工厂(根据传入的被代理对象创建代理对象)
    class proxyFactary {
    
        public static Object getProxy(Object obj) {//传入被代理对象
            MyInvocationhandler handler = new MyInvocationhandler();
            handler.band(obj);
            Object proxyInstance = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);//参数依次是:被代理对象的类加载器,被代理对象的实现接口,Invocationhandler接口的实现类对象
            return proxyInstance;
        }
    }
    
    //自定义InvocationHandler的实现类
    class MyInvocationhandler implements InvocationHandler {
        private Object obj;
    
        public void band(Object obj) {
            this.obj = obj;
        }
    
    
        //在上面的创建了代理对象之后,我们无论通过代理对象调用什么方法都会动态的执行下面的invoke方法
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//三个参数分别是代理对象,代理对象要执行的方法,方法参数
            Object invoke = method.invoke(obj, args);//调用代理对象的方法,这里的obj是被代理对象
            return invoke;
    
        }
    }
    迎风少年
  • 相关阅读:
    iOS 开发之粒子效果
    ios 中使用SBJson拼接和解析json
    iphone document 图片存储和读取
    ios项目绕过证书访问https程序
    我应该直接学Swift还是Objective-C?
    iOS中使用 Reachability 检测网络
    iOS App性能优化
    iOS中的堆(heap)和栈(stack)的理解
    iOS中引用计数内存管理机制分析
    iOS多线程编程Part 3/3
  • 原文地址:https://www.cnblogs.com/ZYH-coder0927/p/13785394.html
Copyright © 2011-2022 走看看