一、什么是动态代理
动态代理指做一件事,不用全部都亲力亲为,划分一部分给更专业的人去办理。
二、动态代理的特点
1、有两个角色:被代理人和代理人
2、有一件事必须做,但又不完全由自己做。
3、代理人拥有被代理人的资料。
三、怎么实现
1、创建一个接口
package com.fsl.proxy;
public interface People {
//买火车票
public void buyTrainTicket();
public String getId();
public String getName();
}
2、创建被代理人
package com.fsl.proxy;
//被代理人,张三
public class ZhangSan implements People {
private String id;
private String name;
public ZhangSan() {
}
public ZhangSan(String id, String name) {
super();
this.id = id;
this.name = name;
}
//张三要买火车票回家过年
@Override
public void buyTrainTicket() {
System.out.println("我要买到赣州的火车票!");
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、创建代理人
package com.fsl.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//代理人,黄牛
public class HuangNiu implements InvocationHandler {
People target;
public Object getInstance(People target) {
this.target = target;
Class clazz = this.target.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
}
/**
* 原理:
* 1、拿到被代理对象的引用,然后获取到它的接口
* 2、JDK代理重新生成一个类,同时实现代理对象的所实现的接口
* 3、重新动态生成一个class字节码
* 4、然后编译,生成一个代理类
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("你好," + this.target.getName() + " 先生/女士");
System.out.println("我是黄牛,请问您是要买到哪里的票?");
System.out.println("==================================");
method.invoke(this.target, args);
System.out.println("==================================");
System.out.println("您的票买到了,请拿好!");
return null;
}
}
测试类
package com.fsl.proxy;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
People people = (People)new HuangNiu().getInstance(new ZhangSan("123456", "张三"));
people.buyTrainTicket();
}
}
分享到:
相关推荐
在软件工程中,代理模式是一种常见的设计模式,它通过为一个对象提供一个替代品或占位符来控制对这个对象的访问。这种模式通常用于添加额外的功能(例如日志记录、事务管理等)而无需修改原始对象的实现。本文将详细...
代理模式是一种设计模式,它允许我们为一个对象创建一个代理对象,这个代理对象在客户端与目标对象之间起到中介的作用,可以增强或修改目标对象的行为,同时保持相同的接口。在Java中,我们可以使用JDK的动态代理...
在Java世界中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种设计模式,它允许程序员在不修改源代码的情况下,插入新的行为或增强已有功能。Spring框架是AOP实现的一个典范,它提供了两种主要的动态...
除了基本的代理实现,JDK动态代理还可以结合其他设计模式,如工厂模式,创建更加复杂的代理对象。此外,Spring框架中的AOP功能也是基于JDK动态代理或CGLIB实现的,它允许开发者定义切面,对满足特定条件的方法进行...
### JAVA设计模式在JDK中的应用 #### 一、引言 在软件开发过程中,设计模式作为一套被广泛接受的解决方案,能够帮助开发者解决常见的设计问题。Java作为一门流行的编程语言,其标准库(JDK)中巧妙地融入了多种设计...
java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法...
代理模式是一种设计模式,它允许我们在不修改原有对象的情况下,为对象添加新的功能或行为。在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最...
Java中的动态代理是一种重要的设计模式,它允许在运行时创建具有特定行为的代理对象,以扩展或增强原有对象的功能。动态代理主要分为两种技术:JDK动态代理和CGLIB动态代理。 ### JDK动态代理 JDK动态代理是Java...
代理模式是一种设计模式,它提供一个代理类来控制对原对象的访问。在静态代理中,我们通过编写额外的代理类来实现这一目标,但在动态代理中,代理类是在运行时生成的,无需预先编写代码。 Java JDK提供了`java.lang...
java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...
代理模式是软件设计中的一种设计模式,它为其他对象提供了一个代理对象,以控制对原始对象的访问。代理模式属于结构型模式,它的主要作用是提供一个代理对象,以便控制对原始对象的访问,保护原始对象不被外部访问。...
动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...
拦截器(Interceptor)是一种设计模式,通常用于在方法调用前后插入额外的逻辑,如日志、事务管理、权限验证等。在JDK动态代理中,我们可以实现InvocationHandler接口,并在`invoke`方法中添加这些逻辑。当代理对象...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建对象的代理,从而可以在不修改原有代码的情况下,对原有...同时,它也是设计模式中的代理模式的一种实现,有助于解耦系统组件,使代码结构更加清晰。
Java 动态代理是Java语言中的一个重要特性,它允许我们在...这在设计模式中被称为代理模式,对于构建复杂、模块化的系统具有重要作用。了解和熟练使用这两种动态代理技术,可以极大地提升Java开发的效率和代码质量。
代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...
JDK 中的 23 个设计模式简介 在 Java 开发领域,设计模式是一个非常重要的概念,它能够帮助开发者写出更加灵活、可维护、可扩展的代码。JDK 中也提供了许多设计模式的实现,本文将对其中的 23 个经典设计模式进行...
在Java编程领域,动态代理是一种常见的设计模式,用于在运行时创建对象的代理,以便在调用实际目标方法之前或之后插入额外的行为。主要存在两种常见的动态代理技术:JDK动态代理和CGLIB(Code Generation Library)...
在Java编程领域,代理模式是一种常见且重要的设计模式,它允许我们为一个对象提供一个代理以控制对该对象的访问。代理模式在实际应用中广泛用于数据缓存、权限控制、事务处理等方面。JDK和CGLIB是Java中实现动态代理...