当前位置:   article > 正文

Java中的动态代理机制详解

Java中的动态代理机制详解

Java中的动态代理机制详解

大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!

动态代理是一种在运行时生成代理对象的机制,而不是在编译时确定。它允许在运行时创建一个实现了一组给定接口的新类,这样的类被称为动态代理类或者代理对象。

动态代理的实现方式

Java中主要通过两种方式实现动态代理:基于接口的动态代理(JDK动态代理)和基于类的动态代理(CGLIB动态代理)。

1. 基于接口的动态代理(JDK动态代理)

JDK动态代理通过反射机制生成代理对象,要求目标对象必须实现一个或多个接口。

package cn.juwatech.example;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface Subject {
    void doSomething();
}

class RealSubject implements Subject {
    @Override
    public void doSomething() {
        System.out.println("RealSubject is doing something.");
    }
}

class DynamicProxyHandler implements InvocationHandler {
    private Object target;

    public DynamicProxyHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before invoking...");
        Object result = method.invoke(target, args);
        System.out.println("After invoking...");
        return result;
    }
}

public class DynamicProxyExample {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        InvocationHandler handler = new DynamicProxyHandler(realSubject);

        Subject proxySubject = (Subject) Proxy.newProxyInstance(
                Subject.class.getClassLoader(),
                new Class[]{Subject.class},
                handler
        );

        proxySubject.doSomething();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
2. 基于类的动态代理(CGLIB动态代理)

CGLIB动态代理是通过继承目标类并重写方法实现的,因此不要求目标类实现接口。

package cn.juwatech.example;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

class RealSubject {
    public void doSomething() {
        System.out.println("RealSubject is doing something.");
    }
}

class DynamicProxyInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("Before invoking...");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("After invoking...");
        return result;
    }
}

public class CGLIBDynamicProxyExample {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(RealSubject.class);
        enhancer.setCallback(new DynamicProxyInterceptor());

        RealSubject proxySubject = (RealSubject) enhancer.create();
        proxySubject.doSomething();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

动态代理的应用场景

动态代理广泛应用于AOP(面向切面编程)中,用于横切关注点的统一处理,例如日志记录、性能统计、权限控制等。

结论

通过本文的介绍,我们深入了解了Java中动态代理的基本原理、实现方式及其应用场景。掌握动态代理可以帮助我们更好地设计和优化代码结构,提高系统的灵活性和可维护性。

微赚淘客系统3.0小编出品,必属精品!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/873884
推荐阅读
相关标签
  

闽ICP备14008679号