Java学习之动态代理篇

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

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

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 结尾

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119933.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PHP程序开发之使用header定义一个php页面为utf-8编码或GBK编码

    PHP程序开发之使用header定义一个php页面为utf-8编码或GBK编码php页面为utf-8编码 header(“Content-type:text/html;charset=utf-8”); php页面为gbk编码 header(“Content-type:text/html;charset=gb2312”); php页面为big5编码 header(“Content-type:text/html;charset=b

    2022年7月11日
    30
  • 十六、状态模式—用类表示状态 #和设计模式一起旅行#

    人有悲欢离合,月有阴晴圆缺!故事背景白天、黑夜是不同的状态,水蒸气、冰是水不同的状态,大千的世界,不同的各种东西会有很多种状态,本篇要介绍的就是 “用类来表示状态”,用类表示状态后,我们就可以切换类来方便地改变对象的状态。故事主角状态模式:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。在状态模式结构中包括几个角色: – Conte…

    2022年2月27日
    36
  • 2021年材料员-岗位技能(材料员)新版试题及材料员-岗位技能(材料员)考试试卷

    2021年材料员-岗位技能(材料员)新版试题及材料员-岗位技能(材料员)考试试卷题库来源:安全生产模拟考试一点通公众号小程序安全生产模拟考试一点通:硝化工艺题库来源:安全生产模拟考试一点通公众号小程序安全生产模拟考试一点通:硝化工艺考试内容是安全生产模拟考试一点通生成的,硝化工艺证模拟考试题库是根据硝化工艺最新版教材汇编出硝化工艺仿真模拟考试。2021年硝化工艺考试内容及硝化工艺考试报名1、【单选题】三不动火是指:没有经批准的动火作业票不动火;监护人不在现场不动火;()。(A)A、安全措施不落实不动火B、分析不合格不动火C、领导不在现场不动火2、【单选题】苯硝化

    2022年5月30日
    42
  • 086-vdbench

    086-vdbench【1】centos下的安装首先安装JavaJDK和一些工具包sudoyuminstall-yjava-1.7.0-openjdkjava-1.7.0-openjdk-develunzip./vdbench-t【2】vdbench是一个I/O工作负载生成器,用于验证数据完整性和度量直接附加和网络连接的存储的性能。它是一个免费的工具,容易使用,而且常常用于测试和基准测试。…

    2022年5月19日
    47
  • 秒杀多线程第四篇 一个经典的多线程同步问题

    秒杀多线程第四篇 一个经典的多线程同步问题

    2021年12月2日
    42
  • sqlserver之清空表数据

    sqlserver之清空表数据方法—xxx为表名truncatetablexxx大家好,我是黑夜の骑士,欢迎大家关注我的博客,笔者将持续输出revit二次开发以及编程干货

    2022年6月12日
    153

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号