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)


相关推荐

  • laravel 使用create 报错 MassAssignmentException

    laravel 使用create 报错 MassAssignmentException

    2021年10月24日
  • docker 权限问题 Got permission denied while trying to connect to the Docker daemon socket at 。。。「建议收藏」

    docker 权限问题 Got permission denied while trying to connect to the Docker daemon socket at 。。。「建议收藏」在用户权限下docker命令需要sudo否则出现以下问题通过将用户添加到docker用户组可以将sudo去掉,命令如下sudogroupadddocker#添加docker用户组sudogpasswd-a$USERdocker#将登陆用户加入到docker用户组中newgrpdocker#更新用户组…

  • Modbus CRC校验算法

    uint16_tcrc_reflect(uint16_tdata,int32_tlen){uint16_tret=data&0x01;for(int32_ti=1;i<len;i++){data>>=1;ret=(ret<<1)|(data&am…

  • jsonobject string转json_java jsonobject转string

    jsonobject string转json_java jsonobject转string你需要把字符串利用一些字符串函数得到=》{“name”:”小明”,”pwd”:”123″}再转就可以了。比如:entity({“name”:”小明”,”pwd”:”123″})这种就转化不了,会报错。这里的String是有些要求的,首先它要是json格式,其次json格式中不能出现其他的字符。这里的JSONObject对像是不是hutool这些工具类的哦,是java内部自带这个。代码是我手敲的可能会出错。很简单JSONObject有toSting方法直值调用就好。…

  • HibernateTemplate常用方法 .[通俗易懂]

    HibernateTemplate常用方法 .[通俗易懂]HibernateTemplate提供非常多的常用方法来完成基本的操作,比如通常的增加、删除、修改、查询等操作,Spring2.0更增加对命名SQL查询的支持,也增加对分页的支持。大部分情况下,使用Hibernate的常规用法,就可完成大多数DAO对象的CRUD操作。下面是HibernateTemplate的常用方法简介:qvoiddelete(Objecten…

  • 【JS 逆向百例】Fiddler 插件 Hook 实战,某创帮登录逆向

    【JS 逆向百例】Fiddler 插件 Hook 实战,某创帮登录逆向关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶、JS/安卓逆向等技术干货!声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!逆向目标目标:某创帮登录接口主页:aHR0cHM6Ly9tLndjYmNoaW5hLmNvbS9sb2dpbi9vdGhlci1sb2dpbi5odG1s接口:aHR0cHM6Ly9tLndjYmNoaW5hLmNvb..

发表回复

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

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