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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux安装mysql5.7.24

    linux安装mysql5.7.24linux安装mysql5.7.24一、卸载mysql安装有三种方式,包括二进制包安装(UsingGenericBinaries)、RPM包安装、源码安装。一般是前两种比较多卸载方法参考Linux->卸载Mysql方法总结,记得卸载干净二、安装建议路径设置按照写的来将下载的压缩包复制到linux服务器/usr/local/路径下(下载地址https://de…

  • Python基础知识归纳「建议收藏」

    Python基础知识归纳「建议收藏」Python基础教程Python基础教程Python简介Python环境搭建Python中文编码Python基础语法Python变量类型Python运算符Python条件语句Python循环语句PythonWhile循环语句Pythonfor循环语句Python循环嵌套Pythonbreak语句Python…

    2022年10月16日
  • navcat15激活码_在线激活

    (navcat15激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • 解决mac连接不上星巴克wifi的问题

    解决mac连接不上星巴克wifi的问题在星巴克写我的第一篇博客,结果mbp连wifi的时候遇到无法跳转到星巴克wifi页的问题,搞了一会儿发现一个好办法。。。正好试写一下mbp(macbookpro)如何连上星巴克的wifi来练个手~问题描述wifi显示连接,chrome浏览器随便打开一个网页却无法跳转,并显示未连接到互联网safari浏览器显示有跳转,但是网页并不能加载出来解决方案1连接上星巴克wifi2打开sa…

  • linux怎样配置yum源_yum配置源

    linux怎样配置yum源_yum配置源目录一:配置本地yum源二:配置网络yum源更新源可以获取最新的软件信息,以更新您的系统Redhat7配置源YUM(YellowdogUpdaterModified):yum是Redhat系列系统基于RPM包构建的软件更新机制,可以自动解决rpm包之间的依赖关系,所有软件包由集中的yum软件仓库提供。其理念是使用一个中心仓库(repository)管理一部分甚至一…

  • 操作系统的功能

    操作系统的功能

    2021年11月29日

发表回复

您的电子邮箱地址不会被公开。

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