java中的jdk代理和cglib代理

本文详细介绍了Java中的JDK代理和CGLIB代理模式,包括它们的实现原理、使用步骤和区别,着重展示了如何通过JDK接口实现和CGLIB子类生成来控制真实对象的访问。

在Java中,代理是一种设计模式,它允许一个对象(代理)控制对另一个对象(真实对象)的访问。Java中的代理主要分为两种类型:JDK(Java Dynamic Proxy)代理和CGLIB(Code Generation Library)代理。

JDK 代理

JDK 代理是 Java 动态代理的一种实现方式,它是通过 Java 反射机制来实现的。JDK 代理要求被代理的类必须实现一个或多个接口,因为它是基于接口的代理。

使用步骤:

定义接口: 定义一个接口,它是被代理类和代理类都要实现的接口。

public interface MyInterface {
    void doSomething();
}

实现真实对象类: 实现接口的真实对象类。

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

创建代理对象: 使用 Proxy.newProxyInstance() 方法创建代理对象。

RealObject realObject=new RealObject();

        MyInterface proxyInstance = (MyInterface) Proxy.newProxyInstance(RealObject.class.getClassLoader(), RealObject.class.getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("Before invoking method.");
                Object result = method.invoke(realObject, args);
                System.out.println("After invoking method.");
                return result;
            }
        });
        proxyInstance.doSomething();

CGLIB 代理

CGLIB 代理是通过生成被代理类的子类来实现的,因此不要求被代理类实现接口,它可以代理没有无参构造函数的类。

创建代理对象: 使用 Enhancer 类创建代理对象。

 RealObject realObject=new RealObject();
       //代理是子类型,目标是父类型
       RealObject proxy = (RealObject) Enhancer.create(RealObject.class, new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                System.out.println("Before invoking method.");
                Object result = methodProxy.invokeSuper(o, args);
//                Object invoke = methodProxy.invoke(realObject, args);
                System.out.println("After invoking method.");
                return result;
            }
        });

       proxy.doSomething();

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山河亦问安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值