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

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

Java学习之动态代理篇的更多相关文章

  1. Java学习笔记--动态代理

    动态代理 1.JDK动态代理 JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy ...

  2. Java学习笔记——动态代理

    所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记——RMI&q ...

  3. java学习之动态代理模式

    package com.gh.dynaproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Metho ...

  4. JAVA学习之动态代理

    JDK1.6中的动态代理 在Java中Java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成一个动态代理对象.JDK提供 ...

  5. 深度剖析java中JDK动态代理机制

    https://www.jb51.net/article/110342.htm 本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定 ...

  6. 使用Java中的动态代理实现数据库连接池

    2002 年 12 月 05 日 作者通过使用JAVA中的动态代理实现数据库连接池,使使用者可以以普通的jdbc连接的使用习惯来使用连接池. 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的 ...

  7. java 笔记(3) —— 动态代理,静态代理,cglib代理

    0.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口. 代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存 ...

  8. java中的动态代理机制

    java中的动态代理机制 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现 ...

  9. 一文读懂Java中的动态代理

    从代理模式说起 回顾前文: 设计模式系列之代理模式(Proxy Pattern) 要读懂动态代理,应从代理模式说起.而实现代理模式,常见有下面两种实现: (1) 代理类关联目标对象,实现目标对象实现的 ...

随机推荐

  1. Pandas | Dataframe的merge操作,像数据库一样尽情join

    今天是pandas数据处理第8篇文章,我们一起来聊聊dataframe的合并. 常见的数据合并操作主要有两种,第一种是我们新生成了新的特征,想要把它和旧的特征合并在一起.第二种是我们新获取了一份数据集 ...

  2. Java内存模型分析

    在学习Java内存模型之前,先了解一下线程通信机制. 1.线程通信机制 在并发编程中,线程之间相互交换信息就是线程通信.目前有两种机制:内存共享与消息传递. 1.1.共享内存 Java采用的就是共享内 ...

  3. ElasticsSearch初装 环境Win10

    步骤: 1.从 http://how2j.cn/frontdownload?bean.id=1694 下载6.22 版本 2.双击elasticsearch.bat启动ElasticsSearch [ ...

  4. Centos 镜像文件下载

    1. Centos 官网 https://www.centos.org 进入下载页面,选择下载的版本即可 不推荐在官网下载,因为官网上提供的下载地址很多是国外网站,下载太慢了 2. 阿里云Centos ...

  5. Linux:使用SecureCRT来上传和下载文件

    SecureCRT自带的有几种上传下载功能,SecureCRT下的文件传输协议有以下几种:ASCII.Xmodem.Ymodem.Zmodem. ASCII:这是最快的传输协议,但只能传送文本文件.  ...

  6. 居然仅用浏览器,就完成了Spring Boot应用的开发与部署!

    最近有幸试用了一下阿里云的一个新产品:云开发平台,体验一把全新的开发模式!虽然中间也碰到了一些问题,但整体的体验透露着未来感,因为整个过程都不需要使用我们最常用的IDEA,仅依靠浏览器就把一个Spri ...

  7. Vue中vue.config的配置

    vue-cli 3.x 脚手架搭建完成后,项目目录中没有 vue.config.js 文件,需要手动在根目录中创建 vue.config.js. vue.config.js 是一个可选的配置文件,如果 ...

  8. RabbitMQ消息积压的几种解决思路

    在日常工作中使用RabbitMQ偶尔会遇不可预料的情况导致的消息积压,一般出现消息积压基本上分为几种情况: 消费者消费消息的速度赶不上生产速度,这总问题主要是业务逻辑没设计好消费者和生产者之间的平衡, ...

  9. Linux里隐藏的计算器,你知道它的奥秘吗?

    Linux里隐藏的计算器,你知道它的奥秘吗? 大家都知道,windows下有个计算器工具,我们在工作生活中经常使用到它.但是,你可知Linux下也同样有个计算器吗? 当然,良许说的是命令行下的计算器工 ...

  10. 【小白学PyTorch】12 SENet详解及PyTorch实现

    文章来自微信公众号[机器学习炼丹术].我是炼丹兄,有什么问题都可以来找我交流,近期建立了微信交流群,也在朋友圈抽奖赠书十多本了.我的微信是cyx645016617,欢迎各位朋友. 参考目录: @ 目录 ...