zoukankan      html  css  js  c++  java
  • Java学习之动态代理篇

    Java学习之动态代理篇

    0x00 前言

    在后面的漏洞研究的学习中,必须要会的几个知识点。反射机制和动态代理机制。至于反射的前面已经讲到过了,这里就不做更多的赘述了。

    0x01 动态代理

    这里先来讲一些动态代理的一个定义。

    动态代理是给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。

    ([手动滑稽]其实动态代理就是一个中间商,间接的把东西送到客户手里,但是在此之前肯定要赚点差价)

    我们开发中使用动态代理的主要目的是在不改变目标对象方法的情况下对方法进行增强

    这里再普及几个概念:

    1. 真实对象:被代理的对象
    
    2. 代理对象:
    
    3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
    
    

    我们来写一段正常情况下使用真实对象调用方法的一段代码。

    computer接口代码:

    package com.test.web.proxy;
    
    public interface computer {
        public String method(double money);
        String show();
    }
    
    
    

    lenveo类代码:

    package com.test.web.proxy;
    
    public class lenveo implements computer{
        @Override
        public String method(double money) {
            System.out.println("花了+"+money+"买的电脑");
            return "电脑";
    
        }
    
        @Override
        public String show() {
            System.out.println("展示电脑");
    
            return "展示电脑";
        }
    }
    

    test类代码:

    package com.test.web.proxy;
    
    public class test1 {
        public static void main(String[] args) {
            lenveo lenveo = new lenveo();
            String method = lenveo.method(8000);
            String show = lenveo.show();
            System.out.println(show);
            System.out.println(method);
    
    
    
    
        }
    }
    

    这是一段正常的代码,如果我们需要在不改动其他类代码的情况下对他进行增强,那么就可以使用到动态代理。

    下面来看看动态代理的实现步骤,来根据步骤实现动态代理。

    package com.test.web.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class test {
        public static void main(String[] args) {
            lenveo lenveo = new lenveo();
    
    
                                                //获取传入类加载器                    //获取传入真实对象所有接口
            computer proxy = (computer) Proxy.newProxyInstance(lenveo.getClass().getClassLoader(), lenveo.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("invoke方法执行了");
                    Object obj = method.invoke(lenveo, args);
    
                    return obj;
                }
            });
            String method = proxy.method(3000);
            System.out.println(method);
    
        }
    }
    
    

    这里的Proxy.newProxyInstance方法传入了三个参数分别是:

    1.类的加载器:new出来的真实对象.getClass().getClassLoader()
    
    2.接口数组:new出来的真实对象.getClass().getInterfaces()
    
    3.处理器:new InvocationHandler() 
    

    使用动态代理,代理对象调用任意方法,代理的invoke方法都会执行。

    invoke参数:

    1.proxy:代理对象
    
    2.method:代理对象调用的方法,被封装成的对象
    
    3.args:代理对象调用方法适合传递的实际参数
    
    

    0x02 结尾

    好了,又一篇文章水完,动态代理机制还是比较重要了的。这里也只是一些简单的动态代理内容,后面有空了再更新一下动态代理。

  • 相关阅读:
    【Python】python3.6中实现同一行动态输出
    【Python】将python3.6软件的py文件打包成exe程序
    【Java】分布式RPC通信框架Apache Thrift 使用总结
    【Java】加载驱动方法
    【Java】Comparable和Comparator接口的区别
    【Java】接口(interface)VS抽象类
    【Ubuntu】PHP环境安装-phpstudy for linux版
    【Ubuntu】xrdp完美实现Windows远程访问Ubuntu 16.04
    【系统设计】会议室预定系统房间预定系统设计
    jmeter场景设计:业务占比
  • 原文地址:https://www.cnblogs.com/nice0e3/p/13562660.html
Copyright © 2011-2022 走看看