实例_ Java中的代理模式

静态代理

我们定义一个接口,并且使用代理模式,想要做到的就是在调用这个接口的实现类时在此方法上添加功能。

public interface HelloInterface {
    void sayHello();
}

接下来就是这个接口的实现类,我们在调用sayHello时输出一句话:

public class Hello implements HelloInterface{
    @Override
    public void sayHello() {
        System.out.println("hello world");
    }
}

然后我们设计代理类:

/**
 * 静态代理
 */
public class StaticHelloProxy implements HelloInterface{
    private HelloInterface helloInterface = new Hello();

    @Override
    public void sayHello() {
        System.out.println("say hello before invoke");
        helloInterface.sayHello();
        System.out.println("say hello after invoke");
    }
}

这样我们就实现了静态代理,StaticHelloProxy这个类去代理Hello类。并且给方法扩展了功能。

动态代理

我们在刚刚的静态代理中发现了一个问题,StaticHelloProxy这个代理只能代理Hello这个类,如果有其他的类需要代理,我们就需要更多的代理类,这不是我们想要的。那么能不能在同一个类中代理更多的类呢?实际上通过反射是可以做到的。

public class ProxyHandle implements InvocationHandler {
    private Object object;

    public ProxyHandle(Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("say hello before invoke" + method.getName());
        method.invoke(object, args);
        System.out.println("say hello after invoke" + method.getName());
        return  null;
    }
}

我们定义了一个ProxyHandle,在构造方法中将需要的对象传入,并且通过反射调用方法。当然调用也不太一样。

public static void main(String[] args) {
        HelloInterface helloInterface = new Hello();
        InvocationHandler handler = new ProxyHandle(helloInterface);
        HelloInterface proxyHello = (HelloInterface) Proxy.newProxyInstance(helloInterface.getClass().getClassLoader(),helloInterface.getClass().getInterfaces(),handler);
        proxyHello.sayHello();
    }

这样子就实现了动态代理。

(0)

相关推荐

  • Android插件化开发基础之Java反射机制研究

    一.获得Class对象 Class<?> c = Class.forName("classname"); 抛出ClassNotFoundException 二.获得实现 ...

  • 代理模式

    为什么要学习代理模式?因为这就是Spring AOP的底层机制![Spring AOP 和 Spring MVC] 1.什么是代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在 ...

  • Java-06:动态代理

    6.动态代理 谈及动态代理,难免避不开Java的反射技术. Java的反射机制: 在程序运行时通过加载已知的class,从而可以操作类或者属性和方法.Java是先编译再运行的语言,Java源文件都是要 ...

  • Java中动态代理使用

    相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象. 代理模式 使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过代理类 ...

  • jdk 动态代理源码分析

    闲来无事,撸撸源码 食用方法 直接看代码吧.. package com.test.demo.proxy;import java.lang.reflect.InvocationHandler;impor ...

  • Java设计模式——代理模式

    代理模式 学习目标 掌握代理模式的应用场景和实现原理. 应用场景 保护目标对象:客户并不知道对象是如何实现具体业务功能的,只要调用代理对象的接口就行了. 增强目标对象:在实现目标对象的业务功能之前或者 ...

  • Java 中的关键字

    Java 中有多少个关键字,有大小写之分吗? Java 中有 48 个关键字在使用 + 两个保留关键字未使用,共 50 个关键字. Java 关键字全部都由是小写组成. Java 中保留关键字分别是哪 ...

  • 设计模式(十三)——代理模式

    设计模式(十三)——代理模式

  • Java中的匿名内部类

    一.匿名内部类 之前的所有类都有自己的名字,但是有时候如果某个接口的实现类(或者某个父类的子类)只需要使用一次,此时这样的类如果我们单独定义出来则需要单独为其创建一个"*.java" ...

  • Java中的方法内部类

    一:方法内部类 就是在方法中直接定义一个内部类,之后直接使用这个内部类对象的方法,你作为语法 了解就行了. DEMO:方法中定义内部类     以上是在方法中定义了一个内部类,方法中的内部类能访问方法 ...

  • Java | 在 Java 中执行动态表达式语句: 前中后缀、Ognl、SpEL、Groovy、Jexl3

    在一些规则集或者工作流项目中,经常会遇到动态解析表达式并执行得出结果的功能. 规则引擎是一种嵌入在应用程序中的组件,它可以将业务规则从业务代码中剥离出来,使用预先定义好的语义规范来实现这些剥离出来的业 ...

  • Java中String类的concat方法

    在了解concat()之前,首先需要明确的是String的两点特殊性. 长度不可变 值不可变  这两点从源码中对String的声明可以体现: private final char[] value ; ...

  • java中堆栈(stack)和堆(heap)

    (1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...