这一章节我们讲述一下代理以及动态代理。
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.甚至我们可以通过方法名来控制执行的方法。
总结:我们这一章节讲述了代理以及动态代理。
这一章节就到这里,谢谢。
-----------------------------------
目录
分享到:
相关推荐
在Java开发中,这样的库可以极大地提高开发效率,因为它封装了常见的功能,开发者可以直接使用,而无需从头编写代码。 描述中的 "mchange-commons-java-0.2.11.jar包" 是该库的主要组成部分,是一个Java归档(JAR)...
用户可以轻松地导入现有的Java项目,或者从头开始创建新的项目,包括Maven或Gradle构建系统。 3. **构建工具**:Eclipse 集成了构建工具,如Ant和Maven,使得构建和管理项目依赖变得简单。对于现代Java开发,Maven...
总的来说,这个项目提供了从头开始构建一个NTRIP客户端的机会,涵盖了Android应用开发的多个方面,包括网络通信、协议解析、用户界面设计以及错误处理。对于想要深入理解Android开发和NTRIP协议的开发者来说,这是一...
标题 "aip-java-sdk-4.2.0" 指的是一个针对Android平台的AIP(Artificial Intelligence Platform)SDK的特定版本,版本号为4.2.0。这个SDK是百度公司提供的,用于帮助开发者在Android应用程序中集成和使用百度的各种...
【标题】"Aspose.Words for Java 23.6 with JDK 17 Support" Aspose.Words 是一个强大的文档处理库,专为Java开发者设计,用于创建、操作和转换各种文档格式。版本23.6是这个库的一个重要更新,它引入了对Java ...
它包含了Java编译器、Java运行时环境(JRE)、调试器、文档以及各种实用工具。对于微服务开发来说,JDK的重要性在于: 1. **Java编程语言**:微服务通常使用Java作为主要开发语言,因为Java具有跨平台性、稳定性和...
Java Swing是Java GUI(图形用户界面)开发的一个重要组件,它是Java Foundation Classes (JFC)的一部分,用于构建桌面应用程序。Swing提供了丰富的组件库,允许开发者创建美观且功能丰富的交互式用户界面。在这个...
在Java编程中,多文件...通过这个"java-多文件上传dome"工具包,你可以快速实现上述功能,无需从头编写所有代码。不过,记得在实际项目中,除了功能实现,还要关注性能、安全性和可维护性,确保应用程序的稳定运行。
Java是一种广泛使用的面向对象的编程语言,其特点包括抽象、继承、封装和多态性。在Java笔试中,这些概念经常被考察。 1. **面向对象的特征**: - **抽象**:抽象是将复杂问题简化的过程,分为过程抽象(方法)和...
Java SDK是许多软件开发中的重要组成部分,特别是在与服务器端交互时。在这个名为"java-sdk-master.zip"的压缩包中,包含的是Leancound的Java SDK,这是一个专为集成Leancound服务而设计的开发工具包。Leancound是...
在Java编程中,库(Library)是预先编写好的代码集合,程序员可以导入并直接使用,无需从头开始编写所有功能。这些库通常以JAR(Java Archive)文件的形式存在,里面封装了类和方法,可供应用程序调用。Java库广泛...
【标题】:“curso-java-pildorasInf:从头开始学习Java” 这门“从头开始学习Java”的课程,源自"PillsInformática"的教育资源,旨在为初学者提供全面的Java编程知识。Java是一种广泛使用的面向对象的编程语言,由...
在Java开发中,创建具有模糊效果的视图背景可以提升应用程序的用户体验,使其看起来更加现代和精致。"使用渲染脚本实现模糊视图背景"是一个常见的技术实践,它通常涉及到图形处理和用户界面的设计。在这个项目中,...
根据压缩包的文件名 "ks-java-lib-master" 可以推测,这可能是一个 Git 仓库的主分支(master branch)的克隆,通常包含了库的源代码、构建脚本、测试用例以及相关的文档。开发者可以通过查看源码学习如何使用库中的...
Java平台提供了一系列库来支持这些操作,本项目中涉及的主要有Spire.Doc、Spire.PDF以及Apache PDFBox。让我们详细探讨这些库的功能及其在Java开发中的应用。 首先,`Spire.Doc.jar`是Spire.Doc for Java的库文件,...
**Free Spire.Doc for Java - 3.9 无水印** `Free Spire.Doc for Java` 是一款专为Java开发者设计的文档处理库,它允许用户在Java应用程序中创建、编辑和转换Microsoft Word文档。这个3.9版本提供的是无水印版本,...
字节程序Java代理, 乐器, 字节好友 字节码程序java-agent-and-instrument java-agent-and-instrument-test APM ,追踪, 方法增强, 热模块替代品 完毕 空中漫步查明拉链框架开发,例如:dubbo,spring, arthas,...
1. **源代码示例**:可能有Java代码示例,展示了如何使用Java Desktop Toolkit开发软电话应用,包括基本的通话功能、拨号、接听、挂断、音量控制以及更高级的功能如转移、会议呼叫等。 2. **API文档**:Genesys可能...