美文网首页
Java反射 动态代理

Java反射 动态代理

作者: lc_666 | 来源:发表于2020-04-02 22:14 被阅读0次

    代理模式

    • 使用一个代理将对象包装起来,使用该代理来取代原始对象;
    • 任何对原始对象的调用要通过代理来调用;
    • 代理类和被代理类需要实现同样的接口;

    静态代理实例

    • 代理类和被代理类在编译期间已经被确认;
    public class StaticProxyTest {
    
        public static void main(String[] args) {
            NikeShoeFactory nikeShoeFactory = new NikeShoeFactory();
            ProxyShoeFactory proxyShoeFactory = new ProxyShoeFactory(nikeShoeFactory);
            proxyShoeFactory.makeShoes();
        }
    }
    
    interface ShoeFactory{
        void makeShoes();
    }
    
    //代理类
    class ProxyShoeFactory implements ShoeFactory{
    
        private ShoeFactory shoeFactory;
    
        public ProxyShoeFactory(ShoeFactory shoeFactory) {
            this.shoeFactory = shoeFactory;
        }
    
        @Override
        public void makeShoes() {
            System.out.println("Proxy begins...");
            shoeFactory.makeShoes();
            System.out.println("Proxy ends...");
    
        }
    }
    //代理类
    class NikeShoeFactory implements ShoeFactory{
    
        @Override
        public void makeShoes() {
            System.out.println("Making nike shoes...");
        }
    }
    

    动态代理实例

    • 创建接口及被代理类;
    public interface Actor {
        void act();
    
        String sing();
    }
    
    //被代理类
    public class HuaYiActor implements Actor {
    
        @Override
        public void act() {
            System.out.println("I am acting....");
        }
    
        @Override
        public String sing() {
            return "Lalalalala.....";
        }
    }
    
    • 创建 代理工厂类;
    //代理类工厂
    public class ProxyFactory {
        // 提供静态方法,放回一个代理类的对象
        public static Object getProxyInstance(Object object) {
    
            MyInvocationHandler myInvocationHandler =new MyInvocationHandler();
            myInvocationHandler.setObject(object);
    
            return Proxy.newProxyInstance(object.getClass().getClassLoader(),
                    object.getClass().getInterfaces(),
                    myInvocationHandler);
        }
    }
    
    public class MyInvocationHandler implements InvocationHandler {
        // 需要使用被代理类的对象进行初始化
        private Object object;
    
        public void setObject(Object object) {
            this.object = object;
        }
    
        /**
         * 使用代理类的对象调用被代理类的方法时,会调用此方法
         * @param proxy
         * @param method 代理类的方法,也就是需要被代理类执行的方法
         * @param args 代理类方法的参数
         * @return
         * @throws Throwable
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            return method.invoke(object, args);
        }
    }
    
    • 测试
    public class ProxyTest {
        public static void main(String[] args) {
            HuaYiActor actor = new HuaYiActor();
            Actor proxyInstance = (Actor) ProxyFactory.getProxyInstance(actor);
            actor.act();
            String sing = actor.sing();
            System.out.println(sing);
            //I am acting....
            //Lalalalala.....
        }
    }
    

    相关文章

      网友评论

          本文标题:Java反射 动态代理

          本文链接:https://www.haomeiwen.com/subject/syfqphtx.html