本文最后更新于:39 分钟前
Java动态代理
Java动态代理是Java的核心特性之一,它允许开发者在运行时动态地创建和操作对象。动态代理主要被用于实现AOP(面向切面编程)以及设计模式如装饰器、门面等。
Java动态代理主要涉及以下三个关键类:
- java.lang.reflect.Proxy:这个类是Java动态代理的入口,它提供了一些方法用于创建动态代理实例。
- java.lang.reflect.InvocationHandler:这个接口定义了一个方法,即invoke,该方法用于处理对动态代理实例的方法调用。
- java.lang.reflect.Proxy.newProxyInstance:这个方法用于创建动态代理实例。
Java动态代理的特点包括:
- 动态代理可以在运行时动态地创建代理类和代理对象,无需手动编写代理类。
- 动态代理可以代理任意接口的实现类,不需要为每一个被代理类都创建一个代理类,大大减少了代码量。
- 动态代理的功能扩展不需要修改源代码,可以通过动态地添加、删除、修改代理对象来实现,符合开闭原则。
- 动态代理可以在运行时动态地切换代理对象,非常灵活。
Java动态代理的缺陷包括:
- 动态代理只能代理接口,无法代理普通类。
- 动态代理在运行时通过反射机制动态生成代理类和代理对象,会增加系统的运行时开销。
- 动态代理只能代理实现了接口的目标对象,无法代理没有实现接口的目标对象。
- 当目标对象的方法比较多时,使用动态代理会导致代码量较大,不利于代码的维护。
示例
定义一个接口
1 2 3
| public interface Animal { void type(); }
|
实现该接口
1 2 3 4 5 6 7
| public class Cat implements Animal {
@Override public void type(){ System.out.println("Type is cat"); } }
|
创建代理类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class AnimalDynamicProxyHandler implements InvocationHandler {
private final Object target;
public AnimalDynamicProxyHandler(Object target) { this.target = target; }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before method call"); Object result = method.invoke(target, args); System.out.println("After method call"); return result; }
|
使用
1 2 3 4 5 6 7 8 9
| public class Main {
public static void main(String[] args) throws Exception { AnimalDynamicProxyHandler proxyHandler = new AnimalDynamicProxyHandler(new Cat()); Animal proxy = (Animal) Proxy.newProxyInstance(Animal.class.getClassLoader(), new Class[]{Animal.class}, proxyHandler); proxy.type(); }
}
|
输出:
1 2 3
| Before method call Type is cat After method call
|