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的参数:
- (lenveo.getClass().getClassLoader()类加载器
- lenveo.getClass().getInterfaces()真实对象接入的接口
- 匿名内部类,执行器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的参数
- proxy:代理对象
- method:代理对象执行的方法
- args:代理对象调用方法适合传递的实际参数
0x03结尾
使用动态代理,代理对象调用任意方法,代理的invoke方法都会执行。
动态代理机制还是很重要的,这上面这是很简单的一部分。
来源:https://www.cnblogs.com/0x3e-time/p/16311467.html
本站部分图文来源于网络,如有侵权请联系删除。