百木园-与人分享,
就是让自己快乐。

java学习之动态代理

0x00动态代理

在后面的漏洞研究的学习中,必须要会的几个知识点。反射机制和动态代理机制。至于反射的前面已经讲到过了,这里就不做更多的赘述了。反射是通过class文件去获取对象对象的方法.

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

0x01动态代理的基础

用途:我们使用动态代理的作用是在不改变对象的方法的前提下,增强对象的功能

  • 真实对象:被代理的对象
  • 代理对象:
  • 代理模式:代理对象为真实对象,达到增强真实对象功能的目的

实现的方式:

  • 静态代理:有一个类文件描述代理模式,类似于中介
  • 动态代理:在内存中形成代理

0x02实现的步骤

  • 代理对象和真实对象要实现相同的接口

  • 代理对象=proxy.newInstance();

  • 使用代理对象调用方法

  • 增强方法

    实现接口:

package proxyTest;

public interface computer {
    public String method(double money);
    String show();
}

实现真实对象:

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 \"展示电脑\";
    }
}

实现动态代理:

//获取传入类加载器 //获取传入真实对象所有接口

proxy的参数:

  1. (lenveo.getClass().getClassLoader()类加载器
  2. lenveo.getClass().getInterfaces()真实对象接入的接口
  3. 匿名内部类,执行器invoke
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);
        proxy.show();

    }
}

invoke的参数

  1. proxy:代理对象
  2. method:代理对象执行的方法
  3. args:代理对象调用方法适合传递的实际参数

0x03结尾

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

动态代理机制还是很重要的,这上面这是很简单的一部分。


来源:https://www.cnblogs.com/0x3e-time/p/16311467.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » java学习之动态代理

相关推荐

  • 暂无文章