cglib实现动态代理和jdk实现动态代理,它们之间有什么不同?
时间: 2024-06-15 22:05:53 浏览: 243
cglib实现动态代理和jdk实现动态代理之间有以下不同之处[^1][^2]:
1. 实现方式:JDK动态代理是通过Java的反射机制来实现的,而CGLib动态代理是通过继承目标类并生成子类来实现的。
2. 代理对象类型:JDK动态代理只能为接口创建代理对象,而CGLib动态代理可以为类创建代理对象。
3. 性能:JDK动态代理在生成代理对象时需要使用反射,因此在调用代理方法时会有一定的性能损耗。而CGLib动态代理通过生成子类来实现代理,因此在调用代理方法时性能更高。
4. 依赖:JDK动态代理是Java标准库的一部分,因此不需要额外的依赖。而CGLib动态代理需要引入CGLib库作为依赖。
5. 对象创建:JDK动态代理创建代理对象时需要传入一个InvocationHandler对象,该对象负责处理代理方法的调用。而CGLib动态代理创建代理对象时不需要传入任何参数。
6. 目标类的要求:JDK动态代理要求目标类实现一个或多个接口,才能为其创建代理对象。而CGLib动态代理可以为任意类创建代理对象,包括没有实现接口的类。
下面是一个使用JDK动态代理和CGLib动态代理的示例代码:
JDK动态代理:
```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface UserService {
void addUser(String username);
}
class UserServiceImpl implements UserService {
public void addUser(String username) {
System.out.println("Add user: " + username);
}
}
class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
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;
}
}
public class Main {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
InvocationHandler handler = new MyInvocationHandler(userService);
UserService proxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),
userService.getClass().getInterfaces(), handler);
proxy.addUser("Alice");
}
}
```
CGLib动态代理:
```java
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
class UserService {
public void addUser(String username) {
System.out.println("Add user: " + username);
}
}
class MyMethodInterceptor implements MethodInterceptor {
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("Before method: " + method.getName());
Object result = proxy.invokeSuper(obj, args);
System.out.println("After method: " + method.getName());
return result;
}
}
public class Main {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback(new MyMethodInterceptor());
UserService proxy = (UserService) enhancer.create();
proxy.addUser("Alice");
}
}
```
阅读全文