Java JDK动态代理(AOP)用法及实现原理详解
1. 什么是动态代理(AOP)?
动态代理是一种代理设计模式中的一种实现方式。一般的代理模式需要我们手动编写代理对象来实现代理,但是动态代理允许我们在运行时动态的创建代理对象,这样就无需手动编写代理对象了。常常使用动态代理实现切面编程(AOP)。
2. Java JDK动态代理实现原理
动态代理是基于Java反射机制实现的。Java JDK中提供了两个类:java.lang.reflect.InvocationHandler
负责调用处理器的接口和java.lang.reflect.Proxy
用来生成代理对象。 JDK动态代理的实现原理主要分成以下三个步骤:
- 创建InvocationHandler接口的实现类(调用处理器类),并实现
invoke()
方法,该方法是动态代理的核心,用于聚拢目标方法和增强代码,并返回结果。 - 获取类的ClassLoader和所有接口interfaces。
- 通过
Proxy.newProxyInstance()
方法创建代理实例。
3. Java JDK动态代理示例1
实现一个动态代理类,当调用目标方法时,打印方法名和参数,并在方法执行前后加上增强代码。
public interface UserService {
void save(String name);
}
public class UserServiceImpl implements UserService {
@Override
public void save(String name) {
System.out.println("save user: " + name);
}
}
public class UserInvocationHandler implements InvocationHandler {
private Object target;
public UserInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("准备执行 " + method.getName() + " 方法,参数为 " + Arrays.toString(args));
Object result = method.invoke(target, args);
System.out.println(method.getName() + " 方法执行完毕,返回结果: " + result);
return result;
}
}
public class Main {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
InvocationHandler invocationHandler = new UserInvocationHandler(userService);
UserService proxy = (UserService) Proxy.newProxyInstance(
userService.getClass().getClassLoader(),
userService.getClass().getInterfaces(),
invocationHandler);
proxy.save("张三");
}
}
4. Java JDK动态代理示例2
使用动态代理实现AOP,假设有一个学生类Student
,它的某个方法study()
,我们要在调用study()方法前后打印日志,示例代码如下:
public interface Student {
void study(String course);
}
public class StudentImpl implements Student {
@Override
public void study(String course) {
System.out.println("学生正在学习 " + course);
}
}
public class StudentLog {
public void beforeStudy() {
System.out.println("准备学习,开始记录日志");
}
public void afterStudy() {
System.out.println("学习完毕,结束记录日志");
}
}
public class StudentInvocationHandler implements InvocationHandler {
private Object target;
private Object aspect;
public StudentInvocationHandler(Object target, Object aspect) {
this.target = target;
this.aspect = aspect;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Method beforeMethod = aspect.getClass().getMethod("beforeStudy");
Method afterMethod = aspect.getClass().getMethod("afterStudy");
beforeMethod.invoke(aspect);
Object result = method.invoke(target, args);
afterMethod.invoke(aspect);
return result;
}
}
public class Main {
public static void main(String[] args) {
Student student = new StudentImpl();
StudentLog studentLog = new StudentLog();
StudentInvocationHandler handler = new StudentInvocationHandler(student, studentLog);
Student proxy = (Student) Proxy.newProxyInstance(
student.getClass().getClassLoader(),
student.getClass().getInterfaces(),
handler);
proxy.study("数学");
}
}
5. 总结
以上,就是Java JDK动态代理(AOP)用法及实现原理详解的完整攻略。动态代理具有很强的灵活性和通用性,可以节约大量代码和维护代理对象的时间。使用动态代理方式进行AOP编程能够很好地解决大量重复代码和模板代码的问题,使得程序变得更加清晰和简洁。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java JDK动态代理(AOP)用法及实现原理详解 - Python技术站