JDK实现动态代理介绍+案例
1、基本概念
JDK 动态代理是 Java 提供的一种在运行时创建代理对象的机制,它允许在不修改目标对象代码的情况下,对目标对象的方法进行增强。这种机制主要基于接口,代理对象会实现与目标对象相同的接口,从而可以在调用目标对象方法前后添加额外的逻辑。
2、代码实现
public class yinyon {
public static void main(String[] args) {
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("打印方法的参数:"+args[0]);
if(method.getName().equals("hello")){
System.out.println("Hello"+args[0]);
}
return null;
}
};
//使用代理方法:
Hellocontroller Hellocontroller = (Hellocontroller) Proxy.newProxyInstance(Hellocontroller.class.getClassLoader(),new Class[]{Hellocontroller.class},handler);
Hellocontroller.hello("cai");
}
}
interface Hellocontroller{
void hello(String name);
}
关键的类和接口:
3、关键类和接口
-
java.lang.reflect.Proxy
:这是 JDK 动态代理的核心类,提供了创建代理对象的静态方法newProxyInstance
。该方法接收三个参数:ClassLoader loader
:目标对象的类加载器。Class<?>[] interfaces
:目标对象实现的接口数组。InvocationHandler h
:调用处理器,用于处理代理对象方法的调用。
-
java.lang.reflect.InvocationHandler
:这是一个接口,其中只有一个方法invoke
,用于定义代理对象方法被调用时的具体逻辑。该方法接收三个参数:Object proxy
:代理对象本身。Method method
:被调用的目标方法。Object[] args
:调用目标方法时传递的参数。
4、优缺点分析
优点
- 解耦性好:代理逻辑与目标对象分离,代理对象和目标对象之间通过接口进行交互,降低了代码的耦合度,便于维护和扩展。
- 遵循开闭原则:不需要修改目标对象的代码,只需要在调用处理器中添加额外的逻辑,符合开闭原则,即对扩展开放,对修改关闭。
缺点
- 只能代理接口:JDK 动态代理要求目标对象必须实现接口,对于没有实现接口的类,无法使用 JDK 动态代理。
- 性能开销:由于使用了反射机制来调用目标对象的方法,反射调用的性能相对较低,尤其是在频繁调用的场景下,会带来一定的性能开销。