这一章节我们讲述一下代理以及动态代理。
1.为什么需要代理?
答案:有一些操作你不想整合到逻辑代码里面,因此需要代理来做这个事情。例如:日志、监控等
下面将演示一个简单的代理:
package com.ray.ch11;
public class Test {
public static void test(InterFace interFace) {
interFace.doSomething();
interFace.doElsething();
}
public static void main(String[] args) {
test(new RealObject());
test(new SimpleProxy(new RealObject()));
}
}
interface InterFace {
void doSomething();
void doElsething();
}
class RealObject implements InterFace {
@Override
public void doSomething() {
System.out.println("RealObject doSomething");
}
@Override
public void doElsething() {
System.out.println("RealObject doElsething");
}
}
class SimpleProxy implements InterFace {
private InterFace interFace;
public SimpleProxy(InterFace interFace) {
this.interFace = interFace;
}
@Override
public void doSomething() {
System.out.println("SimpleProxy doSomething");
interFace.doSomething();
}
@Override
public void doElsething() {
System.out.println("SimpleProxy doElsething");
interFace.doElsething();
}
}
输出:
RealObject doSomething
RealObject doElsething
SimpleProxy doSomething
RealObject doSomething
SimpleProxy doElsething
RealObject doElsething
从上面的代码可以看见,只需要真实对象与代理同时实现一个接口,就满足实现代理的基本要求,其实我们上面的代码在代理里面的两句输出,都是我们不想整合到逻辑代码里面的,因此需要代理这个类来处理这些事情。
2.动态代理
java里面不单是存在代理这个模式,而且还可以动态的创建代理。
我们看下面的代码,我们使用java的动态代理替代了我们上面的静态代理。
package com.ray.ch11;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Test {
public static void test(InterFace interFace) {
interFace.doSomething();
interFace.doElsething();
}
public static void main(String[] args) {
InterFace proxy = (InterFace) Proxy.newProxyInstance(InterFace.class
.getClassLoader(), new Class[] { InterFace.class },
new DynamicProxyHandler(new RealObject()));
test(proxy);
}
}
class DynamicProxyHandler implements InvocationHandler {
private InterFace interFace;
public DynamicProxyHandler(InterFace interFace) {
this.interFace = interFace;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("proxy dosomething");
System.out.println(proxy.getClass());
System.out.println(method);
return method.invoke(interFace, args);
}
}
interface InterFace {
void doSomething();
void doElsething();
}
class RealObject implements InterFace {
@Override
public void doSomething() {
System.out.println("RealObject doSomething");
}
@Override
public void doElsething() {
System.out.println("RealObject doElsething");
}
}
输出:
dosomething
class com.ray.ch11.$Proxy0
public abstract void com.ray.ch11.InterFace.doSomething()
RealObject doSomething
dosomething
class com.ray.ch11.$Proxy0
public abstract void com.ray.ch11.InterFace.doElsething()
RealObject doElsething
上面的代码一样实现了第一点所说的功能,但是有一些需要注意的,就是Proxy.newProxyInstance里面的几个参数
1.是classLoader,这个loader一般是已经加载对象的loader,上面的loader除了可以是InterFace的loader,也可以是Test的loader
2.你希望实现的接口列表(这里一定是接口,而不是类或者抽象类)
3.InvocationHandler的实现
4.在DynamicProxyHandler的实现里面proxy其实是代理,而不是实际的类
5.通过method.invoke(interFace, args)方法执行真实类的方法
6.甚至我们可以通过方法名来控制执行的方法。
总结:我们这一章节讲述了代理以及动态代理。
这一章节就到这里,谢谢。
-----------------------------------
目录
分享到:
相关推荐
从头写React-like框架的工程搭建实现 最近在网上看到了 Build your own React 这篇文章,作者从零开始实现了一个简易类 React 框架,虽然没有过多的优化,但 React 中的核心思想 Concurrent Mode,Fiber ...
字节程序Java代理, 乐器, 字节好友 字节码程序java-agent-and-instrument java-agent-and-instrument-test APM ,追踪, 方法增强, 热模块替代品 完毕 空中漫步查明拉链框架开发,例如:dubbo,spring, arthas,...
从头开始学习Java课程-资料来源PillsInformática。
视频 https://www.bilibili.com/video/BV1914y1s7hi
视频 https://www.bilibili.com/video/BV1914y1s7hi
军工行业2021年度投资策略:而今迈步从头越-20201115-招商证券.pdf
赖世雄英语从头学 下载-附件资源
外卖订餐java源码 你会学到什么 通过 Java 片段的构建块,您将能够立即了解 Java 编程的要点。 你需要什么 勇敢地浏览存储库! 或替代开源 JDK 1.8 版本 截至今天,该存储库已通过测试 Oracle JDK 1.8 OpenJDK 1.8 ...
Java-3D游戏引擎与基本游戏Java中使用LWJGL,OpenGL,OpenAL等的3D游戏引擎。 从头开始
本资料是UCSF DOCK的使用案例分享的输入资料,将使用DOCK 6.11自带的片段库,使用DOCK/RDKit的 DOCK_D3N功能从头设计分子。便于使用者直接从这部分设计工作开始,不需花时间来准备输入文件。
乙二醇2020年度策略报告:“熊”关漫道真如铁,而今迈步从头越-20191230-光大期货-36页.rar
java实现验证码功能源码 Java Periphery 是一个高性能库,用于用户空间 Linux 中的 GPIO、LED、PWM、SPI、I2C、MMIO 和串行外设 I/O 接口访问。 我没有尝试从头开始构建它并生成 JNI 包装器。 这节省了大量手动编码...
开发人员零java-Mentorama 在此存储库中,将从头开始插入Java Developer模块的Mentorama课程期间开发的所有练习。
3D游戏从头编-网上收集,很基础. 第一回:开发环境 第二回:3D基本概念 第三回:第一个D3D程序 第四回:渲染顶点 第五回:渲染索引顶点 第六回:摄象机 第七回:灯光 第八回:纹理 第九回:3D模型(.x)
java源码字符串缓冲区 这是 Java String 、 StringBuilder和StringBuffer方法/API 的完整指南。 本指南的源代码示例在我们的本地开发环境中进行了良好的测试,您可以将这些示例用作无错误。 您可以在 上了解更多信息...
java 源码剖析 Java-Review 说明 这个仓库的建立的原因就是为了在 java 的复习过程中,从源码的角度去认真的钻研一下其内部的原理。 所有的分析和总结都在本人的博客上,希望和大家共同探讨,个人水平有限,有不对的...
Java机器人 这是一个从头开始编写JavaScript机器人
如果您了解一点C或JavaScript,本指南就是从头开始学习Java。 这是一个正在进行的工作,应该在下一个Java LTS(Java 17)发布时准备就绪。 所有代码都在启用预览功能的Java 14上运行。 注意:如果您只希望查看...
Java系列13-Spring Boot 实际上,我们将从头开始逐步开发项目。 我们将详细检查Spring Boot开发环境和体系结构。 借助Spring Boot,我们将探索公司Java项目的基础架构。 您可以通过Spring Framework为自己带来美好的...
2D-Java-Tile-Game 我第一次进入 Java 世界!... 一切都是从头开始编写的(从创建一个基本的 JFrame,到制作画布,渲染图形等......)。 在 src 目录中查看我的脚本。 来自 CodeNMore 的灵感: :