动态代理-接口实现

JDK动态代理


前言

动态代理。


一、动态代理是什么?

动态代理是在程序运行时,让生成的代理对象去干一些非核心的工作;

二、使用步骤

1.抽取当前对象的核心业务代码

代码如下(示例):
由于当前对象里 具体的实现了核心业务代码方法(具体核心业务的实现), 代理对象也有相同的非核心业务代码方法(处理一些杂事),java约定接口的实现类要实现对应的接口;也就是 被代理的对象要实现代理接口;

@Data
public class BigStar implements  Star {

   private String name;

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


    public String sing(String name){
        System.out.println(name + "正在唱歌: " + "我是一只小小鸟");
        return "唱完了 谢谢 谢谢";
    }

    public void dance(){
        System.out.println("跳舞 跳舞 跳舞  跳舞 跳舞 跳舞");
    }

}

2.定义代理对象

代码如下(示例):

public interface Star {

    String sing(String name);

    void dance();

}

3.生成代理对象

代码如下(示例):

package com.shop.until.DynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author ZhangCongHui on 2024/08/17
 */
public class DynamicProxyUtil {


    public static Star getProxy(Star star) {
       /*
        ClassLoader loader, 需要一个类加载器
        Class<?>[] interfaces, 数组类型的代理接口
        InvocationHandler h  处理方法

        */
        Star starProxy = (Star) Proxy.newProxyInstance(

                DynamicProxyUtil.class.getClassLoader(),
                new Class[]{Star.class},
                new InvocationHandler() {
    /*
                Object proxy, 代理类
                Method method, 代理方法
                Object[] args  方法的参数
	*/            
   @Override
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
           String methodName = method.getName();
           if ("sing".equals(methodName)) {
                  System.out.println("代理人开始工作...准备话筒 收费20万  " + methodName);
                        }
           if ("dance".equals(methodName)) {
              System.out.println("代理人开始工作... 准备舞台 收费100万  = " + methodName);
               }
                        //这里是真正的去执行核心业务点的代码
                        Object invoke = method.invoke(star, args);
                        return invoke;
                    }
                });
        return starProxy;
    }

}

总结

测试:

代码如下(示例):

public class TestProxy {

    public static void main(String[] args) {
        BigStar bigStar = new BigStar("杨超越");
        Star starProxy = DynamicProxyUtil.getProxy(bigStar);
        String rs = starProxy.sing("好日子");
        System.out.println("rs = " + rs);
        starProxy.dance();

    }
    
}

运行结果:

代理人开始工作...准备话筒 收费20万  sing
杨超越正在唱 好日子11
rs = 唱完了 谢谢 谢谢
代理人开始工作... 准备舞台 收费100= dance
跳舞 跳舞 跳舞  跳舞 跳舞 跳舞

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值