采用Java代理模式,代理类通过调用委托类对象的方法,来提供特定的服务。委托类需要实现一个业务接口,代理类返回委托类的实例接口对象。
按照代理类的创建时期,可以分为:静态代理和动态代理。
所谓静态代理: 指程序员创建好代理类,编译时直接生成代理类的字节码文件。
所谓动态代理: 在程序运行时,通过反射机制动态生成代理类。
一、静态代理类实例:
1、Serivce.java
- package com.ibm.delegate;
-
-
-
-
-
- public interface Service {
-
-
-
-
- public String queryDate();
-
-
-
- public int sub(int a, int b);
- }
2、ServiceImpl.java
- package com.ibm.delegate;
-
- import java.util.Date;
-
-
-
-
-
- public class CountImpl implements Service {
-
- @Override
- public String queryDate() {
- return new Date().toString();
- }
-
- @Override
- public int sub(int a, int b) {
- return a-b;
- }
-
- public void ownMethod(){
- System.out.println("It's my own method");
- }
- }
3、ServiceProxy.java
- package com.ibm.staticproxy;
-
- import com.ibm.delegate.Serivce;
- import com.ibm.delegate.CountImpl;
-
-
-
-
-
- public class SerivceProxy implements Service {
- private CountImpl countImpl;
-
- public SerivceProxy(CountImpl countImpl){
- this.countImpl = countImpl;
- }
-
- @Override
- public String queryDate() {
- return countImpl.queryDate();
- }
-
- @Override
- public int sub(int a, int b) {
- return countImpl.sub(a, b);
- }
-
- public void ownMethod(){
- System.out.println("It's my own method");
- }
- }
4、ServiceTest.java(测试类)
- package com.ibm;
-
- import com.ibm.delegate.ServiceImpl;
- import com.ibm.staticproxy.ServiceProxy;
-
- public class ServiceTest {
-
-
-
-
- public static void main(String[] args) {
-
- ServiceImpl target = new ServiceImpl();
-
- ServiceProxy proxy = new ServiceProxy(target);
- String date = proxy.queryDate();
- System.out.println(date);
- int result = proxy.sub(10, 20);
- System.out.println("10-20 = "+result);
- proxy.ownMethod();
- }
- }
静态代理类的特点: 代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。而且代理类只能为特定的接口(Service)服务。
动态代理实例:
3、ServiceProxy.java
- package com.ibm.dynamicproxy;
-
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
-
- public class ServiceProxy implements InvocationHandler {
-
- private Object target;
-
- public ServiceProxy(Object target){
- this.target = target;
- }
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- Object result = null;
- result = method.invoke(target, args);
- return result;
- }
-
-
-
-
-
- public Object getProxyInstance(){
- return Proxy.newProxyInstance(target.getClass().getClassLoader(),
- target.getClass().getInterfaces(), this);
- }
- }
4、ServiceTest.java(测试类)
- package com.ibm;
-
- import com.ibm.delegate.Service;
- import com.ibm.delegate.ServiceImpl;
- import com.ibm.dynamicproxy.ServiceProxy;
-
- public class ServiceTest {
-
-
-
-
- public static void main(String[] args) {
-
- ServiceImpl target = new ServiceImpl();
-
- ServiceProxy proxy = new ServiceProxy(target);
- Service service = (Service) proxy.getProxyInstance();
- String date = service.queryDate();
- System.out.println(date);
- int result = service.sub(10, 20);
- System.out.println("10-20 = "+result);
- }
- }
动态代理: 代理类需要实现InvocationHandler接口。
使用场合举例: 如果需要委托类处理某一业务,那么我们就可以先在代理类中,对客户的权限、各类信息先做判断,如果不满足某一特定条件,则将其拦截下来,不让其代理。
修改两个方法,做测试:
ServiceImpl.java
- public String ownMethod(){
- System.out.println("It's my own method");
- return "user";
- }
ServiceProxy.java
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- Object result = null;
- if(!(target instanceof ServiceImpl)){
- System.out.println("不能代理该对象");
- return result;
- }else if(!((ServiceImpl)target).ownMethod().equals("admin")){
- System.out.println("权限不够");
- return result;
- }
- result = method.invoke(target, args);
- return result;
- }
分享到:
相关推荐
Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...
代理模式通常分为静态代理和动态代理两种类型,这两种代理方式各有特点,适用于不同的场景。 **静态代理** 静态代理是通过程序员手动创建一个代理类来实现的。代理类和真实目标类需要实现相同的接口,以便代理类...
Java提供了两种实现代理的主要方式:静态代理和动态代理。 **静态代理** 静态代理是最基础的形式,它需要程序员手动创建一个代理类,该类实现了与目标类相同的接口。代理类持有目标类的引用,并在调用目标类方法...
Java静态代理模式是一种设计模式,它允许我们为一个对象提供一个代理,以便增强或扩展其功能,同时不改变原有对象的代码。在Java中,静态代理是通过在代理类中显式实现目标接口来实现的。下面将详细介绍静态代理模式...
代理模式分为两种主要类型:静态代理和动态代理。 **静态代理** 静态代理是通过程序员手动创建一个代理类来实现的。这个代理类实现了与目标类相同的接口,并且在调用目标方法时添加额外的逻辑。以下是一个简单的...
代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...
### Java静态代理与动态代理详解 #### 一、代理模式概述 代理模式是软件工程领域中常用的一种设计模式,尤其在Java开发中极为常见。它主要用于控制对某个对象的访问,或者提供额外的功能如日志记录、性能追踪、...
Java提供了两种类型的代理:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理关系。代理类和目标类在代码中是显式定义的,它们通常有相同的接口或基类。以下是一个简单的静态代理实例: ```...
动态代理分为静态代理和动态代理两种类型,其中静态代理在源代码级别实现,而动态代理则在运行时动态生成代理类。 #### 二、动态代理的关键概念 - **抽象角色**:通常指接口或抽象类,定义了真实对象和代理对象...
在这个“包含静态代理和动态代理demo代码”的压缩包中,我们可能会看到两种常见的Java代理实现方式的示例:静态代理和动态代理。 首先,我们来详细讲解静态代理。在静态代理中,代理类和真实类(目标类)都是在编译...
静态代理和动态代理是两种常见的代理模式,它们在Java中有着广泛的应用,特别是在SpringBoot等框架中。本资源提供了一个简单的Java实现,适用于JDK1.8版本,并经过了验证,对初学者理解设计模式具有指导意义。 静态...
根据实现方式的不同,代理模式可以分为静态代理和动态代理两种。 ### 静态代理 静态代理是在编译时就已经确定了代理关系。我们需要创建一个代理类,该类实现与目标对象相同的接口,并在代理类的方法中调用目标对象...
在Java中,静态代理是通过定义一个与被代理类实现相同接口的新类来实现的,而动态代理则在运行时动态生成此类,无需预先编写代理类的代码。 `java.lang.reflect.Proxy`类是Java动态代理的核心,它提供了创建代理...
与静态代理(即手动编写代理类)相比,动态代理无需预先为每个接口编写单独的代理类,使得代码更加灵活且易于维护。 2. **代理接口** 在Java动态代理中,我们首先需要定义一个或多个接口。这些接口定义了原始对象...
代理模式主要分为静态代理和动态代理两种类型。 1. 静态代理 在静态代理中,代理类和目标类是在编译时就已经确定的,它们通常具有相同的接口。客户端通过代理类调用方法,代理类再转发到目标类。以下是一个简单的...
本教程将深入探讨静态代理和JDK动态代理的概念、工作原理以及如何实现。 ### 静态代理 静态代理是在编译时就确定了代理类和目标类的关系。代理类和目标类通常都需要实现相同的接口,以便于在代理类中调用目标类的...
代理模式可以分为两种主要类型:静态代理和动态代理。这两种代理方式各有特点,广泛应用于软件系统中,如权限控制、缓存、事务管理等场景。 **静态代理** 静态代理是最基础的代理形式,代理类和被代理类在编译时就...
- **静态方法:** `newProxyInstance`方法用于创建代理类实例,该方法接收三个参数: - `ClassLoader loader`: 定义代理类的类加载器。 - `Class[] interfaces`: 代理类要实现的接口列表。 - `InvocationHandler h`...
在运行时,我们可以动态创建一个实现了特定接口的代理类,从而避免了静态代理的缺点。下面来看看如何使用 JDK 动态代理。首先,我们需要实现 InvocationHandler 接口,这里定义一个 LogInvocationHandler 类public ...