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

相关推荐
qmx_0719 分钟前
HTB-Jerry(tomcat war文件、msfvenom)
java·web安全·网络安全·tomcat
为风而战27 分钟前
IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
java·tomcat
编程零零七1 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
技术无疆2 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
2401_858286112 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py2 小时前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy2 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
C-SDN花园GGbond4 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处5 小时前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ5 小时前
Java 23 的12 个新特性!!
java·开发语言·学习