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

相关推荐
皮皮林5511 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河2 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程4 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅6 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者7 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺7 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart8 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP9 小时前
MyBatis-mybatis入门与增删改查
java
孟陬13 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端