- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java静态代理和动态代理的深入讲解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问.
主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层.
代理模式的元素是:共同接口、代理对象、目标对象.
代理模式的行为:由代理对象执行目标对象的方法、由代理对象扩展目标对象的方法.
代理模式的宏观特性:对客户端只暴露出接口,不暴露它以下的架构.
好处多多:中间隔离了一层,更加符合开闭原则 。
UML图 。
创建一个接口 。
1
2
3
4
5
6
7
8
9
10
|
/**
* @Author: Promsing
* @Date: 2021/4/3 - 8:25
* @Description: 买车的接口
* @version: 1.0
*/
public
interface
BuyCar {
public
void
buyCar();
}
|
创建一个实现类 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/**
* @Author: Promsing
* @Date: 2021/4/3 - 8:25
* @Description: 实现类
* @version: 1.0
*/
public
class
BuyCarImpl
implements
BuyCar {
@Override
public
void
buyCar() {
System.out.println(
"我要买车~~~啦啦啦"
);
}
}
|
创建一个代理类 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/**
* @Author: Promsing
* @Date: 2021/4/3 - 8:26
* @Description: 代理类
* @version: 1.0
*/
public
class
BuyCarProxy
implements
BuyCar{
private
BuyCar buyCar;
//注意事final修饰的关键字 不可修改
//构造函数注入,需要被代理的对象
public
BuyCarProxy(
final
BuyCar buyCar) {
this
.buyCar = buyCar;
}
//静态代理- 的实现方式
@Override
public
void
buyCar() {
System.out.println(
"不贷款,全款!买车前的准备~~~"
);
buyCar.buyCar();
System.out.println(
"买完车了,出去浪~~~"
);
}
}
|
客户端调用 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/**
* @Author: Promsing
* @Date: 2021/4/3 - 8:36
* @Description: 客户端调用
* @version: 1.0
*/
public
abstract
class
ProxyTest
implements
BuyCar {
public
static
void
main(String[] args) {
System.out.println(
"-+-+-+正常调用-+-+-+"
);
BuyCar car=
new
BuyCarImpl();
car.buyCar();
System.out.println(
"-+-+-+使用静态代理-+-+-+"
);
BuyCar proxy=
new
BuyCarProxy(car);
proxy.buyCar();
}
}
-+-+-+正常调用-+-+-+
我要买车~~~啦啦啦
-+-+-+使用静态代理-+-+-+
不贷款,全款!买车前的准备~~~
我要买车~~~啦啦啦
买完车了,出去浪~~~
|
基于接口的动态代理类 。
特点:字节码随用随创建,随用随加载 。
作用:在不修改源码的基础上对方法增强 。
涉及的类:JDK官方提供的Proxy 。
如何创建代理对象:使用Proxy类中的newProxyInstance方法 。
创建代理对象的要求:被代理类至少实现一个接口 。
newProxyInstance方法的参数 。
ClassLoader:类加载器,同于加载被代理对象字节码 。
Class[]:字节码数组---用于让代理对象和被代理对象拥有相同的方法 。
InvocationHandler:用于提供被增强的代码 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
/**
* @Author: Promsing
* @Date: 2021/4/3 - 9:09
* @Description: 描述 形容
* @version: 1.0
*/
public
class
DynamicProxy
implements
InvocationHandler {
private
BuyCar object;
public
DynamicProxy( BuyCar object) {
this
.object = object;
}
/**
*
* @param proxy 代理对象的引用
* @param method 当前执行的方法
* @param args 当前执行方法所需的参数
* @return 和被代理对象方法有相同的返回值
* @throws Throwable
*/
@Override
public
Object invoke(Object proxy, Method method, Object[] args)
throws
Throwable {
System.out.println(
"不贷款,全款!买车前的准备~~~"
);
Object result = method.invoke(object, args);
System.out.println(
"买完车了,出去浪~~~"
);
return
result;
}
}
|
客户端 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public
static
void
main(String[] args) {
System.out.println(
"-+-+-+使用基于接口的代理-+-+-+"
);
//方式1、如不写动态代理类DynamicProxy,可以在这里使用内部类
//声明一个final修饰的对象
/*
final BuyCarImpl car=new BuyCarImpl();
BuyCar proxy=(BuyCar)Proxy.newProxyInstance(car.getClass().getClassLoader(), car.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("不贷款,全款!买车前的准备~~~");
Object result = method.invoke(car, args);
System.out.println("买完车了,出去浪~~~");
return result;
}
});
proxy.buyCar();
*/
//方式2、使用DynamicProxy类
//声明一个final修饰的对象
final
BuyCarImpl car=
new
BuyCarImpl();
BuyCar proxy=(BuyCar)Proxy.newProxyInstance(car.getClass().getClassLoader(), car.getClass().getInterfaces(),
new
DynamicProxy(car));
proxy.buyCar();
}
|
基于子类的动态代理 。
特点:字节码随用随创建,随用随加载 。
作用:在不修改源码的基础上对方法增强 。
涉及的类:第三方cglib提供的Enhancer 。
如何创建代理对象:使用Enhancer类中create方法 。
创建代理对象的要求:被代理类不能是最终类 。
newProxyInstance方法的参数 。
Class:用于被指定代理对象的字节码 。
InvocationHandler:用于提供增强的方法 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
static
void
main(String[] args) {
//使用基于子类的动态代理
//需要引入Jar包--cglib 本案例使用cglib3.3.0
System.out.println(
"-+-+-+使用基于子类的代理-+-+-+"
);
final
BuyCarImpl car=
new
BuyCarImpl();
BuyCar proxy= (BuyCar)Enhancer.create(car.getClass(),
new
MethodInterceptor() {
@Override
public
Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
throws
Throwable {
System.out.println(
"不贷款,全款!买车前的准备~~~"
);
Object result = method.invoke(car, args);
System.out.println(
"买完车了,出去浪~~~"
);
return
result;
}
});
proxy.buyCar();
}
|
到此这篇关于Java静态代理和动态代理的文章就介绍到这了,更多相关Java静态代理和动态代理内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/promsing/article/details/115411648 。
最后此篇关于Java静态代理和动态代理的深入讲解的文章就讲到这里了,如果你想了解更多关于Java静态代理和动态代理的深入讲解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我完全不同意配置代理来检查我正在开发的应用程序的 HTTP(S) 流量。我试过运行 Fiddler2 和 Charles Web Proxy,它们都在 127.0.0.1:888 上运行,并使用以下参
我有一个 AWS 环境,其中有几个实例没有预安装 SSM 代理,也没有 key 对,有没有办法在不使用 SSH 登录我的实例的情况下安装 SSM 代理? 在此先感谢您的帮助! 最佳答案 没有。这是一个
在本教程中,您将借助示例了解 JavaScript 代理。 在 JavaScript 中,proxy(代理对象)用于包装对象并将各种操作重新定义到对象中,例如读取、插入、验证等。代理允许您向对
我有一个基于 Martini 的小型应用程序,但遇到了一个我无法解决的问题。 我想添加一个应用程序功能,允许用户从第三个服务器获取文件,并在 HTTP header 中进行一些更改。某种代理。这些文件
结构对比 讲实话,博主当初学习完整设计模式时,这三种设计模式单独摘哪一种都是十分清晰和明确的,但是随着模式种类的增加,在实际使用的时候竟然会出现恍惚,例如读开源代码时,遇到不以模式命名规范的代码时,
我正在尝试代理运行 ELK 的后端服务器。这是我的环境信息: root@proxy:~# root@proxy:~# cat /etc/*release DISTRIB_ID=Ubuntu DISTR
我需要为我的 java 应用程序编写一个代理,它在每个数组创建时执行一些特定的操作。到目前为止,我无法找到在此事件上运行我的代码的任何方法。 java.lang.instrument.ClassFil
PHP 代理如何工作? 我希望制作一个类似于其他 php 代理的小脚本 但是它实际上是如何工作的呢? 最佳答案 我正在考虑一个 PHP 代理,用于绕过 AJAX Sane Origin 策略。如果您需
我有一个 Electron 应用程序,试图通过该应用程序从同一网络调用url,但是出于安全考虑,我考虑了使用代理的想法。 function createWindow () { const mai
我有 1 台计算机,安装了 1 个网卡。网卡有 10 个 IP 地址分配给它。我在那里运行了一个 Windows 桌面应用程序。该应用程序基本上是一个调用 1 个特定网站的网络浏览器。 我想要实现的是
我想将 Burp 配置为我的 java 代码的代理,以查看请求和响应。Burp 作为 Web 浏览器之间的代理可以很好地工作,但它不适用于 Java 应用程序。 我已经在代码中添加了这样的行: Web
据我所知,在Spring AOP中,当我们想要拦截某些方法调用时,我们会配置一个具有与所需方法调用相匹配的切入点配置的Aspect。也就是说,我们在Aspect端配置拦截。 有没有一种方法可以完全从相
这可能是一个常见问题,但是:我有一个正在向 发出请求的应用程序elldmess.cz/api/... 但是这个api已经没有了。 现在我想要“东西”,即 catch 对 elldmess.cz/api
我正在尝试在 Android 中创建代理,但我必须使用套接字。我已经阅读了很多教程并提出了以下代码。不幸的是,浏览器似乎没有获得任何数据,一段时间后它显示标准网页,说网页不可用。可能是什么原因?感谢您
我在使用此代码时遇到了一些问题,具体取决于我使用的浏览器,有些 URL 在 IE 中显示正确,但在 Firefox 中显示为纯文本(例如 www.microsoft.es 在 IE 上看起来不错,但在
我正在尝试通过 urllib 获取一些 url 并通过我的代理进行 Mechanize 。 使用 mechanize 我尝试以下操作: from mechanize import Browser im
我安装了一个嵌入式设备(光伏转换器),它提供了一个正常的 http Web 界面(信息和设置)。该转换器具有用户身份验证,但只能通过 http 进行。出于安全考虑,我不想将服务器直接发布到互联网上。在
我正在搜索有关如何使用支持 HTTPS 的 Ruby 编写代理的一些示例。我有一个使用 Webricks HTTPProxyServer 实现的简单代理,但我注意到,HTTPS 流量只是隧道传输(它应
我的一位客户刚收到他选择的开发商订购的软件,让我看一下并准备托管程序。 这是一个 Java (jar) 应用程序,到目前为止一切顺利......但我看到了一些可疑的东西,软件每隔 60 分钟左右连接到
我试图在 C# 中创建一个 HTTPS 代理服务器。这里有人发布了解决方案: string host = "encrypted.google.com"; string
我是一名优秀的程序员,十分优秀!