Java动态代理JKD版本

Java动态代理JKD版本_第1张图片

 1、ISale.java

package com.atguigu;
public interface ISale {
    void saleShaoBing();
    void saleJianBing();
    void saleYueBing();
    void saleManTou();
}

2、WuDa.java

package com.atguigu;

//Target:目标类、目标对象
public class WuDa implements ISale{

    //target method:目标方法
    @Override
    public void saleShaoBing() {
        System.out.println("卖烧饼...");
    }

    @Override
    public void saleJianBing() {
        System.out.println("卖煎饼...");
    }

    @Override
    public void saleYueBing() {
        System.out.println("卖月饼...");
    }

    @Override
    public void saleManTou() {
        System.out.println("卖馒头...");
    }
}

3、WuDaInvocationHandler.java

package com.atguigu;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class WuDaInvocationHandler implements InvocationHandler {

    private Object target;

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //method表示目标方法
        String methodName = method.getName();       //获取目标方法名称
        if (methodName.endsWith("Bing")) {
                song();
        }
        return method.invoke(target,args);
    }

    public void song() {
        System.out.println("送大麦茶...");
    }
}

4、ProxyTest.java

package com.atguigu;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class ProxyTest {

    @Test
    public void test03() {
        WuDa wuDa = new WuDa();
        WuDaInvocationHandler handler = new WuDaInvocationHandler(wuDa);

        System.out.println(wuDa.getClass());  //class com.atguigu.WuDa
        Arrays.stream(wuDa.getClass().getInterfaces()).forEach(System.out::println); //interface com.atguigu.ISale

        Object proxyInstance = Proxy.newProxyInstance(wuDa.getClass().getClassLoader(), wuDa.getClass().getInterfaces(), handler);

        ISale iSale = (ISale) proxyInstance;
        iSale.saleJianBing();
        //送大麦茶...
        //卖煎饼...
    }
    @Test
    public void test04() {
        WuDa wuDa = new WuDa();
        WuDaInvocationHandler handler = new WuDaInvocationHandler(wuDa);
        Object proxyInstance = Proxy.newProxyInstance(wuDa.getClass().getClassLoader(), wuDa.getClass().getInterfaces(), handler);

        ISale iSale = (ISale) proxyInstance;
        iSale.saleManTou();
        //卖馒头...
    }


}

Java动态代理是指在运行期间动态地创建一个代理对象,该代理对象可以在调用目标方法前或后添加一些通用的逻辑处理,例如记录日志、安全控制等。而JDK动态代理是指利用Java内置的反射机制,在运行时期间动态生成代理类。具体来说,JDK动态代理会根据传入的接口定义、接口方法以及处理器对象(InvocationHandler)等信息来动态创建代理类,并将代理类与目标对象进行关联,从而实现对目标对象方法的拦截和增强。因为JDK动态代理是基于接口实现的,所以只能代理实现了接口的类。

Java动态代理是一种在运行时动态生成代理类的技术,使用动态代理可以在不修改原始类代码的情况下,为其添加额外的功能或者控制。JDK提供了一个Proxy类和一个InvocationHandler接口,通过这两个类可以实现动态代理。在使用时,需要先创建一个InvocationHandler对象来实现代理的具体逻辑,然后通过Proxy类的静态方法newProxyInstance()来动态生成代理类。动态代理可以极大地简化一些业务代码,比如日志记录,安全检查等等。

 

你可能感兴趣的:(Java设计模式,java,开发语言)