Java两种动态代理模式(JDK,CGLIB)

两种动态代理的区别

  1. JDK使用接口作为代理
  2. CGLIB使用继承类作为代理
    受益匪浅的一篇文章

我的code实现JDK动态代理

Vehicle接口

package com.ruider.reflexAgent.JDKAgent;

/**
 * 可驾驶汽车
 */
public interface Vehicle {
    void drive();
}

Rechargable接口

package com.ruider.reflexAgent.JDKAgent;

/**
 * 可充电汽车
 */
public interface Rechargable {
    void reCharge();
}

ElectricCar实现接口类

package com.ruider.reflexAgent.JDKAgent;

/**
 * 可充电驾驶的汽车
 */
public class ElectricCar implements Vehicle, Rechargable {
    @Override
    public void drive() {
        System.out.println("汽车drive");
    }

    @Override
    public void reCharge() {
        System.out.println("汽车reCharge");
    }
}

触发管理器CarInvocationHandle,实现InvocationHandler接口

package com.ruider.reflexAgent.JDKAgent;

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

public class CarInvocationHandle implements InvocationHandler {

    private ElectricCar car;

    public CarInvocationHandle (ElectricCar car) {
        this.car = car;
    }

    @Override
    public  Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("You are going to invoke "+method.getName()+" ...");
        method.invoke(car, null);
        System.out.println(method.getName()+" invocation Has Been finished...");
        return null;
    }
}

使用Proxy进行测试

package com.ruider.reflexAgent.JDKAgent;

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

public class Main {
    public static void main(String[] args) {
        ElectricCar car = new ElectricCar();
        InvocationHandler carHandle = new CarInvocationHandle(car);
        ClassLoader carClassLoader = ElectricCar.class.getClassLoader();
        Class[] interfaces = ElectricCar.class.getInterfaces();
        Object o = Proxy.newProxyInstance(carClassLoader,interfaces,carHandle);
        Vehicle vehicle = (Vehicle)o;
        vehicle.drive();
        Rechargable rechargable = (Rechargable)o;
        rechargable.reCharge();
    }
}

结果显示

You are going to invoke drive ...
汽车drive
drive invocation Has Been finished...
You are going to invoke reCharge ...
汽车reCharge
reCharge invocation Has Been finished...

猜你喜欢

转载自blog.csdn.net/qq_40910541/article/details/88548369
今日推荐