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核心设计模式:代理设计模式

相关推荐
程序喵大人3 分钟前
推荐个 C++ 练习平台
开发语言·c++·工具推荐
全靠bug跑13 分钟前
Spring Cloud OpenFeign 实战三部曲:快速集成 · 连接池优化 · 客户端抽取
java·spring boot·openfeign
阿里嘎多学长20 分钟前
2025-12-16 GitHub 热点项目精选
开发语言·程序员·github·代码托管
Evan芙29 分钟前
搭建nexus服务,实现本地仓库、代理仓库
java·nginx·tomcat
乂爻yiyao35 分钟前
Java LTS版本重要升级特性对照表
java·开发语言
原来是好奇心1 小时前
深入Spring Boot源码(六):Actuator端点与监控机制深度解析
java·开发语言·源码·springboot
叠叠乐1 小时前
robot_state_publisher 参数
java·前端·算法
过期动态1 小时前
JDBC高级篇:优化、封装与事务全流程指南
android·java·开发语言·数据库·python·mysql
WizLC1 小时前
【Java】各种IO流知识详解
java·开发语言·后端·spring·intellij idea
Mr.朱鹏1 小时前
SQL深度分页问题案例实战
java·数据库·spring boot·sql·spring·spring cloud·kafka