博客介绍`: EvLast
当前专栏: << Java进阶 >>
专题 : 数据结构帮助小白快速入门算法
☆*: .。. o(≧▽≦)o .。.:*☆
❤️感谢大家点赞收藏⭐评论✍️
#新星杯·14天创作挑战营·第9期#
动态代理是一种在运行时创建代理对象的机制,它允许你在不修改原有代码的基础上,对对象的方法进行增强或拦截。在许多编程语言中都有动态代理的实现,不过以 Java 中的动态代理最为典型,下面为你详细介绍。
动态代理的核心原理是在运行时动态生成代理类,该代理类实现了与目标对象相同的接口。当调用代理对象的方法时,实际上会调用代理类中重写的方法,在这个重写的方法里可以添加额外的逻辑,然后再调用目标对象的相应方法。
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
的匿名内部类, 用于在原函数基础上新增的功能