1234567891011121314151617181920212223242526272829303132333435366.3 CGLIB 动态代理实现
时间: 2024-09-04 20:01:12 浏览: 72
CGLIB(Code Generation Library)是一个强大的高性能轻量级的字节码库,它通过动态代理实现了运行期生成 Java 类的技术。在Java中,CGLIB主要用于创建动态代理对象,当需要拦截某个方法的行为,比如AOP(面向切面编程)中的事务管理、日志记录等场景。
CGLIB的工作原理主要包括以下几个步骤:
1. **获取目标类**:首先,CGLIB会获取我们想要代理的目标对象的Class。
2. **创建字节码增强**:它修改并生成一个新的类,这个新类继承自目标类,并添加了额外的方法,通常是被代理的方法加上钩子(如`MethodInterceptor`接口)。
3. **创建代理实例**:利用CGLIB的`Enhancer`工具,我们可以创建这个新类的一个实例,这就是我们的动态代理对象。
4. **代理方法执行**:当我们调用代理对象的方法时,实际上是调用了代理类中经过CGLIB增强后的方法,其中包含了原方法和额外的拦截逻辑。
CGLIB代理通常用于那些难以直接使用Java.lang.reflect.Proxy实现,或者需要更深层次控制代理行为的情况。
相关问题
运用SpringAOP 相关知识,开发基于Cglib 动态代理的案例,要求 1.使用Cglib动态代理; 2.定义接UserManager 及实现类UserManagerlmpl; 3定义切面类MyAspect,在切面类中定义增强方法:检查权限 (checkPermission) 与记录日志(log) 4.定义代理类CglibProxy,实现MethodInterceptor 接口: 5.在代理类中实现对UserManager 中的所有方法进行增强。
好的,我理解了您的要求。下面是基于Cglib动态代理的案例:
1. 定义UserManager接口和实现类UserManagerImpl:
```java
public interface UserManager {
void addUser(String username, String password);
void deleteUser(String username);
}
public class UserManagerImpl implements UserManager {
@Override
public void addUser(String username, String password) {
System.out.println("Add user: " + username);
}
@Override
public void deleteUser(String username) {
System.out.println("Delete user: " + username);
}
}
```
2. 定义切面类MyAspect,实现权限检查和日志记录:
```java
public class MyAspect {
public void checkPermission() {
System.out.println("Checking permission...");
}
public void log() {
System.out.println("Logging...");
}
}
```
3. 定义代理类CglibProxy,实现MethodInterceptor接口:
```java
public class CglibProxy implements MethodInterceptor {
private Object target;
private MyAspect aspect;
public CglibProxy(Object target, MyAspect aspect) {
this.target = target;
this.aspect = aspect;
}
public Object createProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
aspect.checkPermission();
Object result = method.invoke(target, args);
aspect.log();
return result;
}
}
```
4. 编写测试代码:
```java
public static void main(String[] args) {
UserManager userManager = new UserManagerImpl();
MyAspect aspect = new MyAspect();
CglibProxy proxy = new CglibProxy(userManager, aspect);
UserManager userManagerProxy = (UserManager) proxy.createProxy();
userManagerProxy.addUser("Tom", "123456");
userManagerProxy.deleteUser("Tom");
}
```
运行结果:
```
Checking permission...
Add user: Tom
Logging...
Checking permission...
Delete user: Tom
Logging...
```
以上就是基于Cglib动态代理的案例,其中使用了Spring AOP的相关知识,实现了权限检查和日志记录的功能。
运用SpringAOP 相关知识,开发基于Cglib 动态代理的案例,要求 1.使用Cglib 动态代理; 2.定义接口UserManager 及实现类UserManagerImpl; 3.定义切面类MyAspect,在切面类中定义增强方法: 检查权限 (checkPermission) 与记录日志(1og) ; 4.定义代理类CglibProxy,实现MethodInterceptor 接口; 5.在代理类中实现对UserManager 中的所有方法进行增强
好的,这是一个很好的问题!以下是一个基于Cglib动态代理的案例,对UserManager接口进行增强:
UserManager.java:
```java
public interface UserManager {
void addUser(String userId, String userName);
void deleteUser(String userId);
String findUser(String userId);
}
```
UserManagerImpl.java:
```java
public class UserManagerImpl implements UserManager {
@Override
public void addUser(String userId, String userName) {
System.out.println("Add user: " + userId + " " + userName);
}
@Override
public void deleteUser(String userId) {
System.out.println("Delete user: " + userId);
}
@Override
public String findUser(String userId) {
return "Find user: " + userId;
}
}
```
MyAspect.java:
```java
public class MyAspect {
public void checkPermission() {
System.out.println("Checking permission...");
}
public void log() {
System.out.println("Logging...");
}
}
```
CglibProxy.java:
```java
public class CglibProxy implements MethodInterceptor {
private Object target;
private MyAspect myAspect = new MyAspect();
public Object createProxy(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
myAspect.checkPermission();
Object result = method.invoke(target, args);
myAspect.log();
return result;
}
}
```
在测试类中可以这样使用:
```java
public class Test {
public static void main(String[] args) {
UserManager userManager = new UserManagerImpl();
CglibProxy cglibProxy = new CglibProxy();
UserManager userManagerProxy = (UserManager) cglibProxy.createProxy(userManager);
userManagerProxy.addUser("001", "Tom");
userManagerProxy.deleteUser("001");
System.out.println(userManagerProxy.findUser("001"));
}
}
```
运行结果:
```
Checking permission...
Add user: 001 Tom
Logging...
Checking permission...
Delete user: 001
Logging...
Checking permission...
Find user: 001
Logging...
```
阅读全文