Java使用CGLIB进行动态代理的例子
时间: 2023-07-11 19:22:20 浏览: 163
下面是一个使用CGLIB进行动态代理的简单例子:
假设我们有一个接口UserService,其中定义了一个方法getUserById(int id),我们希望对该方法进行拦截,记录方法的执行时间。我们可以使用CGLIB来生成代理类,并通过MethodInterceptor来实现拦截逻辑。
首先,我们需要引入CGLIB的相关依赖:
```xml
<!-- CGLIB -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
```
然后,定义一个UserService的实现类UserServiceImpl:
```java
public class UserServiceImpl implements UserService {
@Override
public User getUserById(int id) {
// 模拟查询数据库
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new User(id, "张三");
}
}
```
接下来,我们定义一个MethodInterceptor来实现拦截逻辑:
```java
public class TimeInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
long start = System.currentTimeMillis();
Object result = proxy.invokeSuper(obj, args);
long end = System.currentTimeMillis();
System.out.println("方法" + method.getName() + "执行时间:" + (end - start) + "ms");
return result;
}
}
```
最后,我们使用CGLIB生成代理类,将拦截逻辑加入到代理类中:
```java
public class CglibTest {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(userService.getClass());
enhancer.setCallback(new TimeInterceptor());
UserService proxy = (UserService) enhancer.create();
proxy.getUserById(1);
}
}
```
在上面的代码中,我们使用Enhancer类来生成代理类,将原始的UserService实现类作为代理类的父类,然后设置MethodInterceptor作为代理类的回调函数。最后,我们通过enhancer.create()方法来创建代理类,并将其强制转换为UserService接口类型,从而实现代理类的功能。
当我们调用代理类的getUserById方法时,MethodInterceptor中的intercept方法将被执行,从而实现了对方法的拦截。
阅读全文