0

0

java代理模式怎么应用

WBOY

WBOY

发布时间:2023-05-06 12:52:06

|

1233人浏览过

|

来源于亿速云

转载

一、代理模式介绍

代理模式其实就是找替身,要去办一件事儿,自己不去,找人代替你去,这就是代理模式。在程序中就是,为对象提供一个替身,控制替身去访问目标对象,这样做的好处是,除了目标对象能提供的功能外,还可以让替身多做一些活,即可以扩展目标对象的功能。被代理的可以是远程对象、创建时开销很大的对象或者需要安全控制的对象。

代理模式主要分为以下三种:

二、静态代理

「1、静态代理介绍:」

使用静态代理的时候,需要定义接口或者父类,被代理的对象和代理对象需要一起实现相同的接口或者继承相同的父类。

「2、应用实例:」

  • 定义一个接口:     TeacherDao

  • 定义被代理的对象:     TeacherDaoImpl,需要实现     TeacherDao

  • 定义代理对象:     TeacherDaoProxy,也需要实现     TeacherDao

  • 要调用     TeacherDaoImpl方法时,需要先创建     TeacherDaoProxy对象,然后创建     TeacherDaoImpl对象,将     TeacherDaoImpl对象交给     TeacherDaoProxy对象,再调相关方法 

代码实现:
public interface TeacherDao {
void teach();
}
 
  • TeacherDaoImpl.java:

public class TeacherDaoImpl implements TeacherDao {
@Override
public void teach() {
System.out.println("今天又是没妹子的一天(ノへ ̄、)");
}
}
 
  • TeacherDaoProxy.java:

public class TeacherDaoProxy implements TeacherDao {

private TeacherDao target; // 被代理的对象

public TeacherDaoProxy(TeacherDao target){
this.target = target;
}

@Override
public void teach() {
System.out.println("代理开始");
// 这里可以写一些额外的逻辑,以达到扩展被代理对象的目的,相当于spring的前置通知
target.teach();
// 这里也可以写一些额外的逻辑,以达到扩展被代理对象的目的,相当于spring的后置通知
System.out.println("代理结束");
}
}
 
  • Client.java:调用代理对象

public class Client {

public static void main(String[] args){
// 创建被代理的对象
TeacherDao target = new TeacherDaoImpl();
// 创建代理对象
TeacherDaoProxy proxy = new TeacherDaoProxy(target);
// 通过代理对象调用方法
proxy.teach();
}
}
 

「3、静态代理的优缺点:」

  • 优点:可以在不修改被代理对象的前提下扩展被代理的对象,做一些增强

  • 缺点:需要实现相同的接口或者继承相同的父类,所以代理类会很多,而且如果接口或者父类有改动,代理对象和被代理对象都需要维护 

三、动态代理(JDK代理)

「1、动态代理介绍:」

代理对象不要实现接口,但是被代理对象还是需要实现接口的。动态代理对象的生成,利用的是JDK的API,反射包下的Proxy类,动态地在内存中构建代理对象。

Ke361开源淘宝客系统
Ke361开源淘宝客系统

Ke361是一个开源的淘宝客系统,基于最新的ThinkPHP3.2版本开发,提供更方便、更安全的WEB应用开发体验,采用了全新的架构设计和命名空间机制, 融合了模块化、驱动化和插件化的设计理念于一体,以帮助想做淘宝客而技术水平不高的朋友。突破了传统淘宝客程序对自动采集商品收费的模式,该程序的自动 采集模块对于所有人开放,代码不加密,方便大家修改。集成淘点金组件,自动转换淘宝链接为淘宝客推广链接。K

下载

「2、java.lang.reflect.Proxy:」

这个类有一个newProxyInstance方法,该方法接收三个参数,如下:

static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
 

「3、应用实例:」

  • 定义一个接口:TeacherDao

  • 定义被代理的对象:TeacherDaoImpl,需要实现TeacherDao

  • 定义一个代理工厂ProxyFactory,有一个getProxyInstance方法,需要传入被代理的对象,然后返回代理对象实例,通过代理对象调用被代理对象的方法 

代码实现:
  • TeacherDao.java:

public interface TeacherDao {
void teach();
}
 
  • TeacherDaoImpl.java:

public class TeacherDaoImpl implements TeacherDao {
@Override
public void teach() {
System.out.println("今天又是没妹子的一天(ノへ ̄、)");
}
}
 
  • ProxyFactory.java

public class ProxyFactory {

private Object target; // 被代理的对象

public ProxyFactory(Object target){
this.target = target;
}

// 给被代理的对象生成一个代理对象
public Object getProxyInstance(){
// 参数1:指定被代理对象的类加载器
// 参数2:被代理对象实现的接口类型
// 参数3:事件处理,执行被代理对象的方法
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JDK代理开始");
// 调用方法,args的方法的参数
Object returnValue = method.invoke(target, args);
System.out.println("JDK代理结束");
// 将执行结果return
return returnValue;
}
});
}
}
 
  • Client.java:通过代理调用方法

public class Client {

public static void main(String[] args){
// 创建被代理的对象
TeacherDao target = new TeacherDaoImpl();
// 创建代理对象
TeacherDao proxy = (TeacherDao) new ProxyFactory(target).getProxyInstance();
// 通过代理对象调用被代理对象的方法
proxy.teach();
}
}

四、cglib代理

「1、cglib代理介绍:」

静态代理和动态代理,被代理的对象,都需要实现接口,如果一个类没实现任何接口的,那就要用cglib代理了。cglib代理也叫子类代理,它会在内存中构建一个子类对象,从而实现对被代理对象的扩展。cglib代理底层是通过一个叫ASM的字节码处理框架来转换字节码并生成新的类从而实现代理的。被代理的类不能为final,否则会报错。被代理对象的方法如果是final/static,就不会被拦截,即不会执行被代理对象额外的业务方法。

「2、应用实例:」

  • 首先要添加cglib相关依赖:


cglib
cglib
3.3.0

 
  • TeacherDaoImpl.java:

public class TeacherDaoImpl implements TeacherDao {
@Override
public void teach() {
System.out.println("今天又是没妹子的一天(ノへ ̄、)");
}
}
 
  • CglibProxyFactory.java:

// 需要实现MethodInterceptor并重写其方法
public class CglibProxyFactory implements MethodInterceptor {

private Object target;

public CglibProxyFactory(Object target){
this.target = target;
}

/**
* 返回target的代理对象
* @return
*/
public Object getProxyInstance(){
// 1. 创建工具类
Enhancer enhancer = new Enhancer();
// 2. 设置父类
enhancer.setSuperclass(target.getClass());
// 3. 设置回调函数
enhancer.setCallback(this);
// 4. 创建子类对象,即代理对象
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("CGLIB代理开始");
Object returnValue = method.invoke(target, args);
System.out.println("CGLIB代理结束");
return returnValue;
}
}
 
  • Client.java:通过代理调用方法

public class Client {

public static void main(String[] args){
// 创建被代理的对象
TeacherDaoImpl target = new TeacherDaoImpl();
// 获取代理对象,并将被代理对象传给代理对象
TeacherDaoImpl proxy = (TeacherDaoImpl) new CglibProxyFactory(target).getProxyInstance();
// 执行方法,触发intecept方法,从而实现执行被代理对象的方法
proxy.teach();
}
}

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1132

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

213

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1769

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

20

2026.01.19

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

2

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

2

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

0

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

0

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 52.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号