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

相关推荐
nice_lcj5202 分钟前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam
文丑颜不良啊17 分钟前
LeetCode2861~2880题目解析
java·leetcode
装不满的克莱因瓶29 分钟前
设计模式之策略模式核心概念和应用场景
java·后端·设计模式·架构·系统架构·策略模式
晴天的雨.99234 分钟前
【C++】继承篇
java·开发语言·c++
SomeOtherTime39 分钟前
第 1 讲:内存布局与所有权解剖——栈帧、胖指针与“移动/拷贝”在汇编层面的真实面目
java·开发语言·汇编
qq_4069810344 分钟前
c++ lamda(三)Lambda表达式
java·前端·c++
头发还在的女程序员1 小时前
Java在线租房系统源码解析:Spring Boot+Vue 3+UniApp房源管理与预约看房方案
java·vue.js·spring boot·租房小程序·租房系统·租房软件
FYKJ_20101 小时前
springboot同人周边订单管理系统48955-计算机毕业设计、课程设计
java·javascript·vue.js·spring boot·django·php·课程设计
总要学点什么1 小时前
第106篇:三维特效-流动线效果——让一颗光点沿整条线一路滚到头
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
Flynn Liang1 小时前
LLM 应用安全:Prompt 注入、越权与输入输出护栏
java·人工智能·大模型·langchain4j·llm 安全·prompt 注入·guardrail