网站首页 > java教程 正文
Java动态代理是一种在运行时创建代理类的机制,动态代理可以在不修改源代码的情况下,在运行时为某个接口动态生成实现类,并且可以拦截接口中的方法调用,从而实现一些特殊的功能。
Java 动态代理底层原理是基于反射机制实现的,其中最重要的是 InvocationHandler 接口,它定义了一个 invoke() 方法,用于实现对代理类中各个方法的调用,在 invoke() 方法中,可以实现对真实角色的调用,并进行扩展,实现动态代理的效果。
动态代理的实现步骤:
1. 创建一个实现 InvocationHandler 接口的类,它必须实现 invoke() 方法;
2. 创建被代理的真实对象;
3. 通过 Proxy 类的 newProxyInstance() 方法创建代理对象,它需要参数:
(1)ClassLoader:类加载器,它是用于加载代理对象字节码的,和被代理对象使用相同的类加载器;
(2)Class[]:字节码数组,它是用于让代理对象和被代理对象有相同方法;
(3)InvocationHandler:它是调用处理器,执行代理对象的方法时,会触发该对象的 invoke() 方法;
4. 通过代理对象调用目标方法,实际上会转到 invoke() 方法中,在 invoke() 方法中,可以进行预处理、调用后处理等工作。
反射上一篇文章讲过了,这里就是反射的一个应用,这个最常见的场景就是给代码加日志,例如在执行某个函数前将请求体加入到日志中,执行后将结果加入到日志中。这样可以在不改变原来代码的基础上来实现。接下来就使用上一篇反射的例子继续扩展。
先写一个Person的接口:
package ReflectTest;
public interface PersonInterface {
void printName();
void printAge();
}
写他的实现:
package ReflectTest;
public class Person implements PersonInterface{
private String name = "xiaoming";
private String age = "12";
@Override
public void printName()
{
System.out.println(name);
}
@Override
public void printAge()
{
System.out.println(age);
}
}
然后写动态代理类:
package ReflectTest;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyHandler implements InvocationHandler {
private Object target;
public ProxyHandler(Object target) {
this.target = target;
}
public Object bind() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("执行函数前加入日志");
Object result = method.invoke(target, args);
System.out.println("执行函数后加入日志");
return result;
}
}
最后测试一下:
package ReflectTest;
public class main {
public static void main(String[] args) {
ProxyHandler proxyHandler = new ProxyHandler(new Person());
PersonInterface person = (PersonInterface)proxyHandler.bind();
person.printName();
}
}
我们看看结果在执行函数前后执行了其他操作:
SpringAOP其实原理就类似这种。
猜你喜欢
- 2024-10-04 java:jdk动态代理(jdk动态代理实现aop)
- 2024-10-04 Java中代理的理解及其实现方式(1)- 静态代理
- 2024-10-04 Java三种代理模式:静态代理、动态代理和cglib代理
- 2024-10-04 Java 学习笔记--反射与代理机制(静态、动态)
- 2024-10-04 Java的动态代理如何实现?#程序员(java动态代理有什么用)
- 2024-10-04 Java动态代理与静态代理以及它能为我们做什么
- 2024-10-04 Java - 动态代理实现原理以及ASM技术
- 2024-10-04 深入理解Java反射和动态代理(jdk动态代理和反射)
- 2024-10-04 java手把手教你写动态代理和静态代理的实现
- 2024-10-04 Java动态代理简单介绍(java动态代理的两种方式)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)