[Java]动态代理

Java实现动态代理

        Java中的动态代理是一种在运行时动态创建代理类和对象的机制,允许开发者在不修改原类代码的情况下,增加额外的功能。主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现。

准备要求:

1.接口:动态代理要求目标对象必须实现一个或多个接口

2.实现InvocationHandler:这是一个接口,你需要在代理类中实现它,用来定义代理对象在处理方法调用时的行为。

3.Proxy类:这是提供新代理实例的类。它包含静态方法newProxyInstance,用于在运行时创建代理对象。

实现流程:

1. 定义接口:定义一个或多个接口,这些接口将被代理类实现。

2. 实现InvocationHandler:创建一个类实现InvocationHandler接口,并在invoke方法中定义代理逻辑。

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

关系示意图:

示例:

1.首先创建被代理对象的接口:

public interface IService {
    public void sayHello();
    public void sayGoodbye();
}

2.创建该接口的实现类:

public class ServiceImpl implements IService{
    @Override
    public void sayHello() {
        System.out.println("hello world");
    }

    @Override
    public void sayGoodbye() {
        System.out.println("goodbye world");
    }
}

3.编写增强类(实现InvocationHandler接口的类)增强我们的接口实现类:

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

//增强类
public class ServiceHandler implements InvocationHandler {

    //引入需要被增强类的实例对象
    private Object target;

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


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before method: " + method.getName());
        //通过反射机制来执行原始方法
        Object result = method.invoke(target, args);
        System.out.println("After method: " + method.getName());
        return result;
    }
}

4.客户端代码:

import java.lang.reflect.Proxy;

public class Main {
    public static void main(String[] args) {

        //创建被增强类(我的接口的实现类)对象
        ServiceImpl service = new ServiceImpl();

        //创建增强类(InvocationHandler接口的实现类)对象
        ServiceHandler handler = new ServiceHandler(service);

        //生成代理对象(被增强过的IService实例对象)
        IService proxy = (IService) Proxy.newProxyInstance(
                IService.class.getClassLoader(),
                new Class[]{IService.class},
                handler
        );

        proxy.sayHello();

        proxy.sayGoodbye();
    }
}

运行结果:

[Java]动态代理_第1张图片

        可以看到,我们成功地通过动态代理的方式对Service实现了增强。原本只会打印一句"Hello world",现在调用sayHello方法时,还会额外进行两句话地打印。在实际开发中,不一定就只是打印两句话,还可以干更多的事情。 

你可能感兴趣的:(Java全栈,spring,java,mysql)