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

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

最新文章

  1. HP服务器 hp 360g5 centos7安装问题
  2. ENode 2.8 最新架构图简介
  3. oracle 性能优化建议小结
  4. C#生成XML的三种途径
  5. MVC ValidationAttribute 服务器端自定义验证
  6. THML结构语义化之table/form
  7. Android 安装镜像
  8. sql server获取当前年月日 时分秒
  9. MySQL的JOIN(一):用法
  10. MySQL 基础命令
  11. form表单中get和post两种提交方式的区别
  12. 排序算法Java实现(快速排序)
  13. spring集成redis
  14. Android应用市场的帮助类
  15. git 推送远程仓库和删除远程仓库文件
  16. SSH通过密钥登陆
  17. git合并
  18. AlarmManager的使用和七牛云android SDK上传图片
  19. find 命令参数大全
  20. 深入理解JVM结构

热门文章

  1. 【python】超有用的集合类collections,不来了解一下?
  2. (Python)正则表达式进行匹配
  3. hyperledger fabric 智能合约开发
  4. 字符串对象跟xml格式的转换
  5. ASP.NET解压zip文件,并将解压后的文件放到指定路径中
  6. swift基本体验
  7. windows操作系统的电脑越用越卡?简说几种原因和解决方法。
  8. python链表从尾到头的顺序返回一个ArrayList
  9. rocketmq配置文件参数(broker-xx.properties)
  10. spring mvc(5) HandlerAdapter