举一个动态代理的例子
时间: 2024-02-25 09:52:47 浏览: 52
动态代理示例
假设我们有一个接口`UserService`,它包含了一些操作用户的方法,如查询用户、添加用户、删除用户等。现在我们需要在每个方法执行前后记录日志,我们可以使用Java动态代理来实现此功能。
首先,我们需要实现一个InvocationHandler接口,用于处理代理对象的方法调用。代码如下:
```java
public class LogInvocationHandler implements InvocationHandler {
private Object target;
public LogInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before method " + method.getName());
Object result = method.invoke(target, args);
System.out.println("after method " + method.getName());
return result;
}
}
```
在上面的代码中,我们通过构造函数将原始对象传递给InvocationHandler,然后在invoke()方法中进行日志记录,并调用原始对象的方法。
接下来,我们需要使用Proxy类来创建代理对象。代码如下:
```java
public class UserServiceProxyFactory {
public static UserService createUserServiceProxy(UserService userService) {
return (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),
userService.getClass().getInterfaces(),
new LogInvocationHandler(userService));
}
}
```
在上面的代码中,我们通过调用Proxy类的静态方法newProxyInstance()来创建代理对象。其中,第一个参数为类加载器,第二个参数为原始对象实现的接口,第三个参数为InvocationHandler对象。
最后,我们可以通过以下方式来使用代理对象:
```java
UserService userService = UserServiceProxyFactory.createUserServiceProxy(new UserServiceImpl());
userService.addUser(new User("Tom"));
userService.deleteUser(1);
```
在上面的代码中,我们首先通过UserServiceProxyFactory类来创建代理对象,然后使用代理对象调用原始对象的方法。在每个方法调用前后,我们都可以看到相应的日志输出。这就是通过Java动态代理实现的日志记录功能。
阅读全文