Java动态代理代码快速上手

动态代理的两个核心的点是:代理的行为 和 代理机构。

举个例子,上大学的时候,很多同学吃午饭的时候都是叫别人带饭,有一个人H特别热心肠,想了一个办法,他在门口挂了个公示牌,每天有谁想要找人带饭就写公告牌上写下自己想吃的饭,H每次直接记下谁谁谁想吃什么饭然后去帮大家买饭。这就是一个典型代理的过程。这里代理的行为就是带饭,代理的机构就是H。而且代理行为和代理机构之间进行了解耦。

下面,我们基于这个例子使用JDK提供的代理机制来实现代码。

首先,我们创建一个代理行为类接口BuyLunchInt(因为可能会有很多人需要带饭,并且带不同的饭,用于继承实现)

package proxy;
/**
 * @Author darrenqiao
 */
public interface BuyLunchInt {
    void buyLunch();
}

接着,我们基于代理行为的接口实现代理机构(代理机构的实现是核心)

  • 主要用到两个reflection包中的两个类,Invocationhandler 和 Proxy类。
  • Proxy类通过传入的类信息创建代理实例
  • InvocationHandler则通过实现invoke方法实现代理实例方法的执行

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author darrenqiao
 * 基于代理的行为接口实现的代理机构类
 * 主要工作两部分:
 * 通过Proxy创建代理实例
 * 通过重写InvocationHandler类的invoke方法实现代理行为的执行
 */
public class ProxyAgent implements InvocationHandler {
    private Object target;

    public Object create(Object target) {
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    //实现代理机制,通过反射基于接口调用方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("看看谁要我帮忙带饭");
        method.invoke(target, args);
        System.out.println("呐,你的饭");
        return null;
    }
}

然后,就是有哪些人需要带饭,带什么饭,就实现接口BuyLunchInt并写到公告牌configure.properties中

package proxy;
/**
 * @Author darrenqiao
 */

public class DarrenBuyLunch implements BuyLunchInt {
    @Override
    public void buyLunch() {
        System.out.println("darren要吃炒饭");
    }
}

class=proxy.DarrenBuyLunch

最后,在main方法中,几个步骤,先看看公告牌configure.properties上有么有需要代理的对象,有则创建代理机构并代理执行;没有则退出。

import proxy.BuyLunchInt;
import proxy.ProxyAgent;

import java.io.*;
import java.util.Properties;

/**
 * @Author darrenqiao
 */
public class Main {

    static Properties prop = new Properties();

    static void init(){
        try {
            //这里初始化需要代理的类
            InputStream inputStream = new BufferedInputStream(new FileInputStream("C:\\zongpengq\\code\\testDynamicProxy\\src\\configure.properties"));
            prop.load(inputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        init();
        if (prop.size() == 0){
            System.out.println("今天没人要带饭");
            return;
        }
        //创建代理机构
        ProxyAgent proxyAgent = new ProxyAgent();
        for (String s : prop.stringPropertyNames()) {
            String className = prop.getProperty(s);
            Class classInfo = Class.forName(className);
            //创建具体的代理的对象
            BuyLunchInt buyLunch = (BuyLunchInt)classInfo.newInstance();
            //代理机构为代理对象创建代理实例(类似:给你安排个人代理你去做这件事)
            BuyLunchInt proxy = (BuyLunchInt)proxyAgent.create(buyLunch);
            //代理去做事
            proxy.buyLunch();
        }

    }
}

我们看看运行的结果,如果没有人需要带饭(即把公告牌configure.properties清空),运行结果如下

如果有人需要带饭,比如Darren,在configure.properties中进行了配置,运行结果如下

原文地址:https://www.cnblogs.com/darrenqiao/p/9270854.html

时间: 2024-11-09 00:35:07

Java动态代理代码快速上手的相关文章

java 动态代理代码

java 动态代理代码 最近学了java 代理,感觉很神奇,尤其是动态代理,功能真是强大,如果有了动态代理,那么黑客是不是更加发展一步呢... 实现java动态代理,主要实现几个步骤 1.实现 InvocationHandler 接口,然后实现 public Object invoke(Object proxy, Method m, Object[] args) 方法,代码如下 package com.chapter1.dynamicproxy; import java.lang.reflect

Java 动态代理机制分析及扩展,第 1 部分

引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架.通过阅读本文,读者将会对 Java 动态代理机制有更加深入的理解.本文首先从 Java 动态代理的运行机制和特点出发,对其代码进行了分析,推演了动态生成类的内部实现. 回页首 代理:设计模式 代理是一种常用的设计

Java 动态代理机制分析及扩展

引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架.通过阅读本文,读者将会对 Java 动态代理机制有更加深入的理解.本文首先从 Java 动态代理的运行机制和特点出发,对其代码进行了分析,推演了动态生成类的内部实现. 代理:设计模式 代理是一种常用的设计模式,其

[转]Java 动态代理机制分析及扩展

引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架.通过阅读本文,读者将会对 Java 动态代理机制有更加深入的理解.本文首先从 Java 动态代理的运行机制和特点出发,对其代码进行了分析,推演了动态生成类的内部实现. 代理:设计模式 代理是一种常用的设计模式,其

Java动态代理 深度详解

代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 今天我将用非常简单易懂的例子向大家介绍动态代理的两种类型,接着重点介绍动态代理的两种实现方式(Java 动态代理和 CGLib 动态代理),最后深入剖析这两种实现方式的异同,最后说说动态代理在我们周边框架中的应用. 在开始之前,我们先假设这样一个场景:有一个蛋糕店,它们都是使用蛋糕机来做蛋糕的,而且不同种类的蛋糕

理解java动态代理

java动态代理是java语言的一项高级特性.在平时的项目开发中,可能很难遇到动态代理的案例.但是动态代理在很多框架中起着不可替代的作用,例如Spring的AOP.今天我们就聊一聊java动态代理的实现原理. jdk对于动态代理的支持主要依赖于两个类:Proxy和InvocationHandler.我们先看一下类图. Subject类是主题类,定义了我要做什么.我们需要代理的类即实现Subject接口的RealSubject. 1.InvocationHandler InvocationHand

java动态代理的实现

动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. 通常情况下,代理模式中的每一个代理类在编译之后都会生成一个class文件,代理类所实现的接口和所代理的方法都被固定,这种代理被称之为静态代理(Static Proxy).那么有没有一种机制能够让系统在运行时动态创建代理类?答案就是本文将要介绍的动态代理(Dynamic Proxy).动态代理是一种较

java动态代理

要想了解Java动态代理,首先要了解什么叫做代理,熟悉设计模式的朋友一定知道在Gof总结的23种设计模式中,有一种叫做代理(Proxy)的对象结构型模式,动态代理中的代理,指的就是这种设计模式. 在我看来所谓的代理模式,和23种设计模式中的"装饰模式"是一个东西.23种设计模式中将它们作为两种模式,网上也有些文章讲这两种模式的异同,从细节来看,确实可以人为地区分这两种模式,但是抽象到一定高度后,我认为这两种模式是完全一样的.因此学会了代理模式,也就同时掌握了装饰模式. 代理模式 代理模

java 动态代理示例,带主要注释

Java proxy是基于反射,仅仅支持基于接口的动态代理. java 动态代理是一切架构的基础,必须了解. 废话少说,先上代码获得感性认识. 示例代码有主要注释. 接口: public interface Subject { String hello(String name); void say();} 接口实现: public class ImpSubject implements Subject { @Override public String hello(String name){ r