介绍Java动态代理,并学习怎么使用Java动态代理

Java动态代理是一种在运行时在程序中创建一个代理对象的功能。使用Java动态代理,我们可以在运行时动态的创建一个实现了一个或多个接口的代理类,该代理类可以代替实际类(即被代理类)与其他类交互,从而达到对实际类进行控制的目的。

Java动态代理的核心是InvocationHandler接口,它定义了一个invoke方法,当方法被调用时,会自动调用invoke方法。

下面是如何使用Java动态代理:

1.定义一个实现InvocationHandler接口的类

public class MyInvocationHandler implements InvocationHandler {

    private Object target;

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

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

2.使用Proxy类的静态方法创建代理对象

public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)

参数说明:

  • loader:类加载器,用于加载动态代理类。

  • interfaces:被代理类实现的接口,用于指定代理类要实现哪些接口。

  • h:InvocationHandler接口的实例,用于实现代理方法的逻辑。

MyInvocationHandler handler = new MyInvocationHandler(new RealSubject());
ISubject subject = (ISubject) Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
            new Class[]{ISubject.class},
            handler);

3.使用代理对象调用方法

subject.request();

完整示例代码如下:

interface ISubject {
    void request();
}

class RealSubject implements ISubject {
    @Override
    public void request() {
        System.out.println("RealSubject.request()");
    }
}

public class MyInvocationHandler implements InvocationHandler {

    private Object target;

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

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

public class Test {
    public static void main(String[] args) {
        MyInvocationHandler handler = new MyInvocationHandler(new RealSubject());
        ISubject subject = (ISubject) Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
                new Class[]{ISubject.class},
                handler);
        subject.request();
    }
}

输出结果为:

Before method request executed
RealSubject.request()
After method request executed

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值