在Java编程中,动态代理是一种在运行时动态创建代理类及其对象的技术。通过动态代理,我们可以在不修改原有类代码的情况下,为这些类添加新的行为或功能。Java提供了两种主要的动态代理机制:基于接口的Java动态代理和基于类的Cglib动态代理。在Spring AOP(面向切面编程)中,Cglib动态代理扮演着重要角色。本文将详细讨论这两种动态代理的实现。
一、Java动态代理
Java动态代理主要依赖于java.lang.reflect包中的Proxy类和InvocationHandler接口。它要求被代理的对象必须实现一个或多个接口,因为动态代理生成的代理类也是这些接口的实现类。
1.InvocationHandler接口
InvocationHandler接口定义了一个invoke方法,该方法在代理实例上的方法被调用时被调用。
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
其中,proxy是代理实例,method是被调用的方法,args是方法的参数。
2.代理实例
使用Proxy.newProxyInstance方法可以创建动态代理实例:
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
其中,loader是类加载器,interfaces是代理类要实现的接口列表,h是调用处理器。
3.示例
假设我们有一个接口HelloService和一个实现类HelloServiceImpl:
public interface HelloService {
void sayHello();
}
public class HelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("Hello, world!");
}
}
现在,我们想要为HelloService添加日志功能,但不修改HelloServiceImpl的代码。我们可以创建一个动态代理:
public class
Java动态代理与Cglib在SpringAOP中的应用与比较

最低0.47元/天 解锁文章
2888





