java动态代理的使用和代码示例

文章目录

  • [1. 简介](#1. 简介)
  • [2. 代码](#2. 代码)
  • [3. 参考链接](#3. 参考链接)

1. 简介

代理类在程序运行时创建的代理方式被成为动态代理。在静态代理中,代理类(RenterProxy)是自己已经定义好了的,在程序运行之前就已经编译完成。而动态代理是在运行时根据我们在Java代码中的"指示"动态生成的。动态代理相较于静态代理的优势在于可以很方便的对代理类的所有函数进行统一管理,如果我们想在每个代理方法前都加一个方法,如果代理方法很多,我们需要在每个代理方法都要写一遍,很麻烦。而动态代理则不需要。

spring 中aop便是基于代理进行的

2. 代码

需要代理的用户

一个大明星

java 复制代码
public class BigStar implements Star{
    private String name;

    public BigStar(String name){
        this.name = name;
    }

    public String sing(String name){
        System.out.println(this.name + "在唱" + name);
        return "谢谢!!!";
    }
    public void dance(){
        System.out.println(this.name + "跳舞!!!");
    }
}

遵守规则,写个接口

java 复制代码
public interface Star {
    String sing(String name);
    void dance();
}

我是代理工厂

java 复制代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyUtil {
    public static Star createProxy(BigStar bigStar){
        /*
         *     public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
         */
        Star starProxy = (Star)Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() {

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if(method.getName().equals("sing")){
                    System.out.println("准备话筒,收钱");
                }else if(method.getName().equals("dance")){
                    System.out.println("场地准备中。。。收钱。。。");
                }
                return method.invoke(bigStar, args);
            }
        });
        return starProxy;
    }
}

测试类

java 复制代码
public class Test {
    public static void main(String[] args) {
        BigStar bigStar = new BigStar("岳轩子");
        Star starProxy = ProxyUtil.createProxy(bigStar);
        String rs = starProxy.sing("恭喜发财");
        System.out.println(rs);

        starProxy.dance();
    }
}

运行结果:

java 复制代码
准备话筒,收钱
岳轩子在唱恭喜发财
谢谢!!!
场地准备中。。。收钱。。。
岳轩子跳舞!!!

3. 参考链接

java动态代理
【黑马磊哥】Java动态代理深入剖析,真正搞懂Java核心设计模式:代理设计模式

相关推荐
A charmer2 分钟前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq5 分钟前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml428 分钟前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~29 分钟前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong16168831 分钟前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7891 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java1 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山1 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
睡觉谁叫~~~2 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
音徽编程2 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust