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

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

831

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

735

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

733

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

396

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

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

精品课程

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

共23课时 | 2.4万人学习

C# 教程
C# 教程

共94课时 | 6.4万人学习

Java 教程
Java 教程

共578课时 | 44.3万人学习

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

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