MST

星途 面试题库

面试题:Java中Java动态代理模式在AOP编程中的基础应用

请简述Java动态代理模式在AOP编程中是如何实现日志记录功能的,需说明代理对象创建过程及如何在代理方法中添加日志记录代码。
41.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

代理对象创建过程

  1. 定义接口:首先定义一个接口,目标类需要实现该接口。例如:
public interface UserService {
    void addUser();
}
  1. 实现接口的目标类
public class UserServiceImpl implements UserService {
    @Override
    public void addUser() {
        System.out.println("添加用户");
    }
}
  1. 创建InvocationHandler实现类:实现InvocationHandler接口,并重写invoke方法。在invoke方法中,会调用目标方法并添加日志记录逻辑。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class LoggingInvocationHandler implements InvocationHandler {
    private Object target;

    public LoggingInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 记录日志:方法调用前
        System.out.println("开始调用方法 " + method.getName());
        Object result = method.invoke(target, args);
        // 记录日志:方法调用后
        System.out.println("方法 " + method.getName() + " 调用结束");
        return result;
    }
}
  1. 创建代理对象:使用Proxy类的newProxyInstance方法创建代理对象。
import java.lang.reflect.Proxy;

public class ProxyFactory {
    public static Object createProxy(Object target) {
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new LoggingInvocationHandler(target)
        );
    }
}

在代理方法中添加日志记录代码

LoggingInvocationHandler类的invoke方法中添加日志记录代码。如上述代码中,在调用目标方法method.invoke(target, args)之前,输出“开始调用方法 [方法名]”;在调用目标方法之后,输出“方法 [方法名] 调用结束”。这样就实现了在代理方法执行前后记录日志,从而实现AOP编程中的日志记录功能。

使用示例:

public class Main {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        UserService proxy = (UserService) ProxyFactory.createProxy(userService);
        proxy.addUser();
    }
}

当调用代理对象的addUser方法时,就会触发日志记录。