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:代理对象调用方法适合传递的实际参数

增强方法

1.篡改参数

java
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方法执行了");
                if (method.getName().equals(method)){
                    double money=(double) args[0];
                    money=money*85;
                   String Object obj =(String)method.invoke(lenveo,money);
                    return obj+"送你一套鼠标";
                }
                else {
                    Object invoke = method.invoke(lenveo, args);
                    return invoke;
                }

            }
        });
        String method = proxy.show();
        String show = proxy.show();
`       System.out.println(proxy.method(200));`


    }
}

0x03结尾

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

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

posted @ 2022-05-26 17:36  不成大哥不改名  阅读(117)  评论(0)    收藏  举报