【Java进阶教程】反射原理之动态代理

【Java进阶教程】反射原理之动态代理_第1张图片

博客介绍`: EvLast

当前专栏: << Java进阶 >>

专题 : 数据结构帮助小白快速入门算法

☆*: .。. o(≧▽≦)o .。.:*☆

❤️感谢大家点赞收藏⭐评论✍️
#新星杯·14天创作挑战营·第9期#

在这里插入图片描述

在这里插入图片描述

什么是动态代理:

动态代理是一种在运行时创建代理对象的机制,它允许你在不修改原有代码的基础上,对对象的方法进行增强或拦截。在许多编程语言中都有动态代理的实现,不过以 Java 中的动态代理最为典型,下面为你详细介绍。

原理

动态代理的核心原理是在运行时动态生成代理类,该代理类实现了与目标对象相同的接口。当调用代理对象的方法时,实际上会调用代理类中重写的方法,在这个重写的方法里可以添加额外的逻辑,然后再调用目标对象的相应方法。

作用

  • 增强功能:能够在不改变目标对象代码的前提下,为其添加额外的功能,比如日志记录、事务管理等。
  • 解耦:把一些通用的功能(如日志、权限验证)从业务逻辑中分离出来,降低代码的耦合度。

动态代理的实践:

分别创建
【Java进阶教程】反射原理之动态代理_第2张图片

Pet类

public class Pet implements PetInetface{
    private String name;
    @Override
    public void eat() {
        System.out.println("eat feat");
    }
    @Override
    public void run(){
        System.out.println("run");
    }

    public Pet() {
    }
    public Pet(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

PetInetface 类

public interface PetInetface {

    public void eat();

    public void run();
}

PetUtil 类 (核心)

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

public class PetUtil {
    public static PetInetface createPet(Pet pet){
        // 配置文件
        PetInetface pp =(PetInetface) Proxy.newProxyInstance(
                PetUtil.class.getClassLoader(), // 类加载器
                new Class[]{PetInetface.class}, // 将代理加载到内存当中 指定代理长什么样
                new InvocationHandler() { // 用来指定代码需要做什么?
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        /*
                        * 参数一 : 代理对象
                        * 参数二 : 要运行的方法
                        * 参数三 : 传递的参数
                        * */
                        if("eat".equals(method.getName())){
                            System.out.println("准备食物.........");
                        } else if("run".equals(method.getName())) {
                            System.out.println("出门..........");
                        } else {
                            System.out.println("白兰...........");
                        }
                        return method.invoke(pet, args);
                    }
                }
        );
        return pp;
    }
}

Test类

public class Test {
    public static void main(String[] args) {
        Pet pet = new Pet();
        PetInetface proxyPet = PetUtil.createPet(pet);
        proxyPet.eat();
        proxyPet.run();
    }
}

动态代理总结:

创建Pet类用于实现 PetInetface 接口, 然后创建 PetUtil 类 负责创建代理Pet类的代理对象, 其中创建代理对象核心的为Proxy.newProxyInstance() 的静态方法, 其中所需要参数为

  • 类加载器
  • 将代理对象
  • InvocationHandler的匿名内部类, 用于在原函数基础上新增的功能
    然后创建Test类测试方法

动态代理的作用

  1. 解耦业务逻辑和功能增强
  2. 实现 AOP(面向切面编程)
  3. 提高代码的可扩展性和可维护性
  4. 实现透明代理

学习产出:

  • 技术笔记 2 遍
  • CSDN 技术博客 3 篇
  • 习的 vlog 视频 1 个

【Java进阶教程】反射原理之动态代理_第3张图片

你可能感兴趣的:(应用开发,Java,java,开发语言,职场和发展,架构,jvm)